﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныйПрограммныйИнтерфейс

////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.

// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами.
Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт

	Объекты.Вставить(Метаданные.Документы.Анкета.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
	Объекты.Вставить(Метаданные.Документы.НазначениеОпросов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
	Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ВопросыДляАнкетирования.ПолноеИмя(),
		"РеквизитыРедактируемыеВГрупповойОбработке");
	Объекты.Вставить(Метаданные.Справочники.ВариантыОтветовАнкет.ПолноеИмя(),
		"РеквизитыРедактируемыеВГрупповойОбработке");
	Объекты.Вставить(Метаданные.Справочники.ВопросыШаблонаАнкеты.ПолноеИмя(),
		"РеквизитыРедактируемыеВГрупповойОбработке");
	Объекты.Вставить(Метаданные.Справочники.ШаблоныАнкет.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");

КонецПроцедуры

// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей
Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт
	
	// СовместноДляПользователейИВнешнихПользователей.
	НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить(
		Метаданные.Роли.ДобавлениеИзменениеОтветовНаВопросыАнкет.Имя);
	НазначениеРолей.СовместноДляПользователейИВнешнихПользователей.Добавить(
		Метаданные.Роли.ЧтениеОтветовНаВопросыАнкет.Имя);

КонецПроцедуры

// См. ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов
Процедура ПриОпределенииОбъектовСКомандамиОтчетов(Объекты) Экспорт

	Объекты.Добавить(Метаданные.Документы.НазначениеОпросов);

КонецПроцедуры

// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт

	Обработчик = Обработчики.Добавить();
	Обработчик.Версия = "2.3.5.6";
	Обработчик.Идентификатор = Новый УникальныйИдентификатор("cfda47d2-f61f-4c23-84a6-80c77b52e6e5");
	Обработчик.Процедура = "Документы.Анкета.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Обработчик.Комментарий = НСтр("ru = 'Заполнение значения нового реквизита ""Режим анкетирования"" у документов ""Анкета"" прошлых периодов.
								  |До завершения обработки ""Режим анкетирования"" данных документов будет отображаться некорректно.'");
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.ПроцедураЗаполненияДанныхОбновления = "Документы.Анкета.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
	Обработчик.ПроцедураПроверки    = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	Обработчик.ЧитаемыеОбъекты      = "Документ.Анкета";
	Обработчик.ИзменяемыеОбъекты    = "Документ.Анкета";
	Обработчик.БлокируемыеОбъекты   = "Документ.Анкета";

	Обработчик = Обработчики.Добавить();
	Обработчик.Версия = "2.3.5.6";
	Обработчик.Идентификатор = Новый УникальныйИдентификатор("1fdb0962-f814-463a-b560-48ea3d51be27");
	Обработчик.Процедура = "Справочники.ВопросыШаблонаАнкеты.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Обработчик.Комментарий = НСтр("ru = 'Заполнение значения нового реквизита ""Способ отображения подсказки"" в справочнике ""Вопросы шаблона анкеты"".
								  |До завершения обработки ""Способ отображения подсказки"" в данном справочнике будет отображаться некорректно.'");
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ВопросыШаблонаАнкеты.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
	Обработчик.ПроцедураПроверки    = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	Обработчик.ЧитаемыеОбъекты      = "Справочник.ВопросыШаблонаАнкеты";
	Обработчик.ИзменяемыеОбъекты    = "Справочник.ВопросыШаблонаАнкеты";
	Обработчик.БлокируемыеОбъекты   = "Справочник.ВопросыШаблонаАнкеты";

	Обработчик = Обработчики.Добавить();
	Обработчик.Версия = "3.1.9.6";
	Обработчик.Идентификатор = Новый УникальныйИдентификатор("a1581723-c1f5-4b90-b716-a180a4d5a4ad");
	Обработчик.Процедура = "ПланыВидовХарактеристик.ВопросыДляАнкетирования.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Обработчик.Комментарий = НСтр("ru = 'Заполнение значений новых реквизитов ""Вид"", ""Использовать минимальное значение"", ""Использовать максимальное значение"" в вопросах для анкетирования.
								  |До завершения обработки вид вопросов для анкетирования будет отображаться некорректно.'");
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.ПроцедураЗаполненияДанныхОбновления = "ПланыВидовХарактеристик.ВопросыДляАнкетирования.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
	Обработчик.ПроцедураПроверки    = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	Обработчик.ЧитаемыеОбъекты      = "ПланВидовХарактеристик.ВопросыДляАнкетирования";
	Обработчик.ИзменяемыеОбъекты    = "ПланВидовХарактеристик.ВопросыДляАнкетирования";
	Обработчик.БлокируемыеОбъекты   = "ПланВидовХарактеристик.ВопросыДляАнкетирования";

КонецПроцедуры

// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.
Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт
	МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов");
	МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.АнализОпроса);
	МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.АналитическийОтчетПоАнкетированию);
КонецПроцедуры


// См. РассылкаОтчетовПереопределяемый.ОпределитьИсключаемыеОтчеты
Процедура ПриОпределенииИсключаемыхОтчетов(ИсключаемыеОтчеты) Экспорт

	ИсключаемыеОтчеты.Добавить(Метаданные.Отчеты.АнализОпроса);

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Заполнение дерева анкеты

// Параметры:
//  Вопросы - см. Справочник.ШаблоныАнкет.Форма.ФормаМастераТабличныхВопросов.Вопросы
//  Ответы - см. Справочник.ШаблоныАнкет.Форма.ФормаМастераТабличныхВопросов.Ответы
//  ТипТабличногоВопроса - см. Справочник.ШаблоныАнкет.Форма.ФормаМастераТабличныхВопросов.ТипТабличногоВопроса
//  Форма - см. Справочник.ШаблоныАнкет.Форма.ФормаМастераТабличныхВопросов
//  ИмяТаблицыПревью - Строка
//  Ключ - Строка
//
Процедура ОбновитьПревьюТабличныйВопрос(Вопросы, Ответы, ТипТабличногоВопроса, Форма, ИмяТаблицыПревью, Ключ) Экспорт

	ИмяКолонкиБезНомера = "ПревьюТаблицаКолонка_" + СтрЗаменить(Строка(Ключ), "-", "_") + "_";
	ОписаниеТиповСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(70));

	РезультирующаяТаблицаСервер = Форма.РеквизитФормыВЗначение(ИмяТаблицыПревью); // ТаблицаЗначений
	РезультирующаяТаблицаСервер.Колонки.Очистить();

	УдаляемыеРеквизиты = Новый Массив;
	УдаляемыеЭлементыФормы = Новый Массив;
	МассивТекущихКолонокРезультирующейТаблицы = Форма.ПолучитьРеквизиты(ИмяТаблицыПревью);
	Для Каждого ЭлементМассива Из МассивТекущихКолонокРезультирующейТаблицы Цикл
		УдаляемыеРеквизиты.Добавить(ЭлементМассива.Путь + "." + ЭлементМассива.Имя);
		УдаляемыеЭлементыФормы.Добавить(ЭлементМассива.Имя);
	КонецЦикла;

	Для Каждого ЭлементМассива Из УдаляемыеЭлементыФормы Цикл
		НайденныйЭлементФормы = Форма.Элементы.Найти(ЭлементМассива);
		Если НайденныйЭлементФормы <> Неопределено Тогда
			Форма.Элементы.Удалить(НайденныйЭлементФормы);
		КонецЕсли;
	КонецЦикла;

	ДобавляемыеРеквизиты = Новый Массив;
	СчетчикКолонок = 0;

	МассивВопросы = Вопросы.ВыгрузитьКолонку("ЭлементарныйВопрос");

	Если Вопросы.Колонки.Найти("НомерСтроки") = Неопределено Тогда
		Вопросы.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
	КонецЕсли;

	Для инд = 0 По Вопросы.Количество() - 1 Цикл
		Вопросы.Получить(инд).НомерСтроки = инд;
	КонецЦикла;

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Вопросы.ЭлементарныйВопрос КАК Вопрос,
	|	Вопросы.НомерСтроки
	|ПОМЕСТИТЬ Вопросы
	|ИЗ
	|	&Вопросы КАК Вопросы
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВопросыДляАнкетирования.Формулировка,
	|	ВопросыДляАнкетирования.ТипЗначения
	|ИЗ
	|	Вопросы КАК Вопросы
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования
	|		ПО Вопросы.Вопрос = ВопросыДляАнкетирования.Ссылка
	|ГДЕ
	|	ВопросыДляАнкетирования.Ссылка В(&Вопросы)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Вопросы.НомерСтроки";

	Запрос.УстановитьПараметр("Вопросы", Вопросы);

	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат;
	КонецЕсли;

	Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда

		ВыборкаВопросы = Результат.Выбрать();
		Пока ВыборкаВопросы.Следующий() Цикл

			СчетчикКолонок = СчетчикКолонок + 1;
			РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + XMLСтрока(СчетчикКолонок),
				ВыборкаВопросы.ТипЗначения, ВыборкаВопросы.Формулировка);
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + XMLСтрока(СчетчикКолонок),
				ВыборкаВопросы.ТипЗначения, ИмяТаблицыПревью));

		КонецЦикла;

	ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда

		ВыборкаВопросы = Результат.Выбрать();
		Пока ВыборкаВопросы.Следующий() Цикл

			СчетчикКолонок = СчетчикКолонок + 1;
			РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + XMLСтрока(СчетчикКолонок),
				ВыборкаВопросы.ТипЗначения, ВыборкаВопросы.Формулировка);
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + XMLСтрока(СчетчикКолонок),
				ВыборкаВопросы.ТипЗначения, ИмяТаблицыПревью));

		КонецЦикла;

		Для инд = 1 По Ответы.Количество() Цикл

			НоваяСтрока    = РезультирующаяТаблицаСервер.Добавить();
			НоваяСтрока[0] = Ответы[инд - 1].Ответ;

		КонецЦикла;

	ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда

		ВыборкаВопросы = Результат.Выбрать();
		Если ВыборкаВопросы.Следующий() Тогда

			СчетчикКолонок = СчетчикКолонок + 1;
			РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + "1", ОписаниеТиповСтрока,
				ВыборкаВопросы.Формулировка);
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1", ОписаниеТиповСтрока,
				ИмяТаблицыПревью));

		КонецЕсли;

		Для инд = 1 По Ответы.Количество() Цикл

			РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + XMLСтрока(инд + 1), ОписаниеТиповСтрока,
				Ответы[инд - 1].Ответ);
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + XMLСтрока(инд + 1),
				ОписаниеТиповСтрока, ИмяТаблицыПревью));

		КонецЦикла;

		Пока ВыборкаВопросы.Следующий() Цикл

			НоваяСтрока    = РезультирующаяТаблицаСервер.Добавить();
			НоваяСтрока[0] = ВыборкаВопросы.Формулировка;

		КонецЦикла;

	ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда

		ТаблицаВопросы = Результат.Выгрузить();

		РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + "1", ТаблицаВопросы[0].ТипЗначения,
			ТаблицаВопросы[0].Формулировка);
		ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1", ТаблицаВопросы[0].ТипЗначения,
			ИмяТаблицыПревью));

		ОтветыВКолонках = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос", МассивВопросы[1]));
		Для инд = 1 По ОтветыВКолонках.Количество() Цикл

			РезультирующаяТаблицаСервер.Колонки.Добавить(ИмяКолонкиБезНомера + XMLСтрока(инд + 1),
				ТаблицаВопросы[2].ТипЗначения, ОтветыВКолонках[инд - 1].Ответ);
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + XMLСтрока(инд + 1),
				ТаблицаВопросы[2].ТипЗначения, ИмяТаблицыПревью));

		КонецЦикла;

		ОтветыВСтроках = Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос", МассивВопросы[0]));
		Для инд = 1 По ОтветыВСтроках.Количество() Цикл

			НоваяСтрока    = РезультирующаяТаблицаСервер.Добавить();
			НоваяСтрока[0] = ОтветыВСтроках[инд - 1].Ответ;

		КонецЦикла;

	КонецЕсли;

	Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
	Форма.ЗначениеВРеквизитФормы(РезультирующаяТаблицаСервер, ИмяТаблицыПревью);

	Для инд = 1 По ДобавляемыеРеквизиты.Количество() Цикл

		Элемент = Форма.Элементы.Добавить(ИмяКолонкиБезНомера + XMLСтрока(инд), Тип("ПолеФормы"),
			Форма.Элементы[ИмяТаблицыПревью]);
		Если ДобавляемыеРеквизиты[инд - 1].ТипЗначения = Новый ОписаниеТипов("Булево") Тогда
			Элемент.Вид = ВидПоляФормы.ПолеФлажка;
		Иначе
			Элемент.Вид = ВидПоляФормы.ПолеВвода;
		КонецЕсли;

		Элемент.ПутьКДанным = ИмяТаблицыПревью + "." + ИмяКолонкиБезНомера + XMLСтрока(инд);
		Если (ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Или ТипТабличногоВопроса
			= Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках) Или (инд > 1) Тогда

			Элемент.Заголовок = РезультирующаяТаблицаСервер.Колонки.Получить(инд - 1).Заголовок;
		Иначе
			Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

// При создании форм устанавливает корневой элемент в дерево шаблона анкеты.
//
Процедура УстановитьКорневойЭлементДереваАнкеты(ДеревоАнкеты) Экспорт

	ЭлементыДерева = ДеревоАнкеты.ПолучитьЭлементы(); // КоллекцияСтрокДереваЗначений
	НоваяСтрока    = ЭлементыДерева.Добавить();

	НоваяСтрока.Формулировка = НСтр("ru = 'Анкета'");
	НоваяСтрока.ТипСтроки    = "Корень";
	НоваяСтрока.КодКартинки  = АнкетированиеКлиентСервер.ПолучитьКодКартинкиШаблонаАнкеты(Ложь);

КонецПроцедуры

// Параметры:
//  ДеревоАнкеты - ДанныеФормыДерево - дерево, в которое добавляется элемент вступления или заключения.
//  Формулировка - Строка - локализуемое представление элемента дерева - либо "вступление", либо "заключение".
//  ТипСтроки    - Строка - тип элемента дерева - либо "вступление", либо "заключение".
//
Процедура УстановитьЭлементДереваРазделовАнкетыВступлениеЗаключение(ДеревоАнкеты, Формулировка, ТипСтроки) Экспорт

	ЭлементыДерева = ДеревоАнкеты.ПолучитьЭлементы();
	НоваяСтрока    = ЭлементыДерева.Добавить();

	НоваяСтрока.Формулировка = Формулировка;
	НоваяСтрока.ТипСтроки    = ТипСтроки;
	НоваяСтрока.КодКартинки  = АнкетированиеКлиентСервер.ПолучитьКодКартинкиШаблонаАнкеты(Ложь);

КонецПроцедуры

// Параметры:
//  Форма                   - ФормаКлиентскогоПриложения - форма, для которой заполняется дерево.
//  ИмяДереваАнкеты         - Строка - имя реквизита формы, в котором будет содержаться дерево анкеты.
//  ШаблонАнкеты            - СправочникСсылка.ШаблоныАнкет - ссылка на шаблон анкеты, согласно которому будет
//                                                            заполнено дерево.
//  ЗаполнятьСтраницыПревью - Булево - признак, необходимо ли формировать таблицы превью табличных вопросов.
//
Процедура ЗаполнитьДеревоШаблонаАнкеты(Форма, ИмяДереваАнкеты, ШаблонАнкеты) Экспорт

	Если ШаблонАнкеты = Справочники.ШаблоныАнкет.ПустаяСсылка() Тогда
		Возврат;
	КонецЕсли;

	Результат = ВыполнитьЗапросПоВопросамШаблонаАнкеты(ШаблонАнкеты);
	Если Результат.Пустой() Тогда
		Возврат;
	КонецЕсли;

	ДеревоАнкетыСервер = Форма.РеквизитФормыВЗначение(ИмяДереваАнкеты);

	Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

	Если Выборка.Количество() > 0 Тогда
		ДобавитьСтрокиДереваАнкеты(Выборка, ДеревоАнкетыСервер.Строки[0], 1, Форма);
	КонецЕсли;

	Форма.ЗначениеВРеквизитФормы(ДеревоАнкетыСервер, ИмяДереваАнкеты);

КонецПроцедуры

// Параметры:
//  Выборка        - ВыборкаИзРезультатаЗапроса - текущая выборка результата запроса.
//  СтрокаРодитель - СтрокаДереваЗначений - родительская строка дерева значений:
//   * Наименование - Строка
//
Процедура ДобавитьСтрокиДереваАнкеты(Выборка, СтрокаРодитель, УровеньРекурсии, Форма)

	Пока Выборка.Следующий() Цикл

		Если Не ЗначениеЗаполнено(Выборка.РодительВопрос) Тогда
			НоваяСтрока = СтрокаРодитель.Строки.Добавить();
		Иначе
			СтрокаРодительПодчиненногоВопроса = СтрокаРодитель.Строки.Найти(Выборка.РодительВопрос, "ВопросШаблона");
			Если СтрокаРодительПодчиненногоВопроса <> Неопределено Тогда
				НоваяСтрока = СтрокаРодительПодчиненногоВопроса.Строки.Добавить();
			КонецЕсли;
		КонецЕсли;

		НоваяСтрока.ВопросШаблона              = Выборка.ВопросШаблона;
		НоваяСтрока.КодКартинки                = АнкетированиеКлиентСервер.ПолучитьКодКартинкиШаблонаАнкеты(
			Выборка.ЭтоРаздел, Выборка.ТипВопроса);
		НоваяСтрока.ТипВопроса                 = Выборка.ТипВопроса;
		НоваяСтрока.ТипТабличногоВопроса       = Выборка.ТипТабличногоВопроса;
		НоваяСтрока.Подсказка                  = Выборка.Подсказка;
		НоваяСтрока.СпособОтображенияПодсказки = Выборка.СпособОтображенияПодсказки;
		НоваяСтрока.ИспользоватьОтказОтОтвета = Выборка.ИспользоватьОтказОтОтвета;
		НоваяСтрока.ФормулировкаОтказаОтОтвета = Выборка.ФормулировкаОтказаОтОтвета;

		НоваяСтрока.ТипСтроки            = ?(Выборка.ЭтоРаздел, "Раздел", "Вопрос");
		Если Форма.ИмяФормы = "Справочник.ШаблоныАнкет.Форма.ФормаЭлемента" Тогда
			НоваяСтрока.ЭлементарныйВопрос = ?(Выборка.ЭтоРаздел, Выборка.Наименование, ?(Выборка.ТипВопроса
				<> Перечисления.ТипыВопросовШаблонаАнкеты.Табличный, Выборка.ЭлементарныйВопрос, Выборка.Формулировка));
			НоваяСтрока.Обязательный       = ?(Выборка.ЭтоРаздел, Неопределено, ?(Выборка.ТипВопроса
				<> Перечисления.ТипыВопросовШаблонаАнкеты.Табличный, Выборка.Обязательный, Неопределено));
			НоваяСтрока.Формулировка       = ?(Выборка.ЭтоРаздел, Выборка.Наименование, Выборка.Формулировка);
			НоваяСтрока.Заметки            = Выборка.Заметки;
			НоваяСтрока.ЕстьЗаметки        = Не ПустаяСтрока(Выборка.Заметки);
		Иначе
			НоваяСтрока.Формулировка       = Выборка.Формулировка;
			НоваяСтрока.ЭлементарныйВопрос = Выборка.ЭлементарныйВопрос;
			НоваяСтрока.Обязательный       = Выборка.Обязательный;
		КонецЕсли;

		НоваяСтрока.Наименование                      = Выборка.Наименование;
		НоваяСтрока.ТипОтвета                         = Выборка.ТипОтвета;
		НоваяСтрока.СоставТабличногоВопроса           = Выборка.СоставТабличногоВопроса.Выгрузить();
		НоваяСтрока.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр");
		НоваяСтрока.ПредопределенныеОтветы            = Выборка.ПредопределенныеОтветы.Выгрузить();
		НоваяСтрока.ПредопределенныеОтветы.Сортировать("НомерСтроки Возр");
		НоваяСтрока.СоставКомплексногоВопроса         = Выборка.СоставКомплексногоВопроса.Выгрузить();
		НоваяСтрока.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр");
		НоваяСтрока.ДиапазонПодсказокЧисловогоВопроса = Выборка.ДиапазонПодсказокЧисловогоВопроса.Выгрузить();
		НоваяСтрока.ДиапазонПодсказокЧисловогоВопроса.Сортировать("НомерСтроки Убыв");
		НоваяСтрока.КлючСтроки                        = Новый УникальныйИдентификатор;
		НоваяСтрока.Длина                             = Выборка.Длина;
		НоваяСтрока.МинимальноеЗначение               = Выборка.МинимальноеЗначение;
		НоваяСтрока.МаксимальноеЗначение              = Выборка.МаксимальноеЗначение;
		НоваяСтрока.ИспользоватьМинимальноеЗначение   = Выборка.ИспользоватьМинимальноеЗначение;
		НоваяСтрока.ИспользоватьМаксимальноеЗначение  = Выборка.ИспользоватьМаксимальноеЗначение;
		НоваяСтрока.ТребуетсяКомментарий              = Выборка.ТребуетсяКомментарий;
		НоваяСтрока.ПояснениеКомментария              = Выборка.ПояснениеКомментария;
		НоваяСтрока.ТипЗначения                       = ?(Выборка.ТипЗначения = Null, Неопределено, Выборка.ТипЗначения);
		НоваяСтрока.Точность                          = Выборка.Точность;

		ПодчиненнаяВыборка = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
		Если ПодчиненнаяВыборка.Количество() > 0 Тогда
			ДобавитьСтрокиДереваАнкеты(ПодчиненнаяВыборка, НоваяСтрока, УровеньРекурсии + 1, Форма);
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

// Выполняет запрос по шаблона анкеты, для формирования дерева анкеты в формах.
//
// Параметры:
//   ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - ссылка на шаблон анкеты, по которому будет выполнен запрос.
//
// Возвращаемое значение
//   РезультатЗапроса - результат запроса по шаблону анкеты.
//
Функция ВыполнитьЗапросПоВопросамШаблонаАнкеты(ШаблонАнкеты)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ВопросыШаблонаАнкеты.Ссылка КАК ВопросШаблона,
	|	ВопросыШаблонаАнкеты.Родитель КАК Родитель,
	|	ВопросыШаблонаАнкеты.Наименование КАК Наименование,
	|	ВопросыШаблонаАнкеты.Обязательный КАК Обязательный,
	|	ВопросыШаблонаАнкеты.ТипВопроса КАК ТипВопроса,
	|	ВопросыШаблонаАнкеты.ТипТабличногоВопроса КАК ТипТабличногоВопроса,
	|	ВопросыШаблонаАнкеты.ЭлементарныйВопрос КАК ЭлементарныйВопрос,
	|	ВопросыШаблонаАнкеты.ЭтоГруппа КАК ЭтоРаздел,
	|	ВопросыШаблонаАнкеты.РодительВопрос КАК РодительВопрос,
	|	ВопросыШаблонаАнкеты.Подсказка КАК Подсказка,
	|	ВопросыШаблонаАнкеты.СпособОтображенияПодсказки КАК СпособОтображенияПодсказки,
	|	ВопросыШаблонаАнкеты.СоставТабличногоВопроса.(
	|		НомерСтроки КАК НомерСтроки,
	|		ЭлементарныйВопрос КАК ЭлементарныйВопрос
	|	) КАК СоставТабличногоВопроса,
	|	ВопросыШаблонаАнкеты.ПредопределенныеОтветы.(
	|		НомерСтроки КАК НомерСтроки,
	|		ЭлементарныйВопрос КАК ЭлементарныйВопрос,
	|		Ответ КАК Ответ
	|	) КАК ПредопределенныеОтветы,
	|	ВопросыШаблонаАнкеты.СоставКомплексногоВопроса.(
	|		НомерСтроки КАК НомерСтроки,
	|		ЭлементарныйВопрос КАК ЭлементарныйВопрос
	|	) КАК СоставКомплексногоВопроса,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.Длина, 0) КАК Длина,
	|	ВопросыДляАнкетирования.ТипЗначения КАК ТипЗначения,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ТребуетсяКомментарий, ЛОЖЬ) КАК ТребуетсяКомментарий,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ПояснениеКомментария, """") КАК ПояснениеКомментария,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.МинимальноеЗначение, 0) КАК МинимальноеЗначение,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.МаксимальноеЗначение, 0) КАК МаксимальноеЗначение,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ИспользоватьМинимальноеЗначение, ЛОЖЬ) КАК ИспользоватьМинимальноеЗначение,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ИспользоватьМаксимальноеЗначение, ЛОЖЬ) КАК ИспользоватьМаксимальноеЗначение,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ТипОтвета, ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ПустаяСсылка)) КАК ТипОтвета,
	|	ЕСТЬNULL(ВопросыШаблонаАнкеты.Формулировка, """") КАК Формулировка,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.Точность, 0) КАК Точность,
	|	ВопросыШаблонаАнкеты.Заметки КАК Заметки,
	|	ВопросыШаблонаАнкеты.ИспользоватьОтказОтОтвета КАК ИспользоватьОтказОтОтвета,
	|	ВопросыШаблонаАнкеты.ФормулировкаОтказаОтОтвета КАК ФормулировкаОтказаОтОтвета,
	|	ВопросыДляАнкетирования.ДиапазонПодсказокЧисловогоВопроса.(
	|		ЗначениеДо КАК ЗначениеДо,
	|		Подсказка КАК Подсказка,
	|		НомерСтроки КАК НомерСтроки
	|	) КАК ДиапазонПодсказокЧисловогоВопроса
	|ИЗ
	|	Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования
	|		ПО ВопросыШаблонаАнкеты.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка
	|ГДЕ
	|	НЕ ВопросыШаблонаАнкеты.ПометкаУдаления
	|	И ВопросыШаблонаАнкеты.Владелец = &Владелец
	|
	|УПОРЯДОЧИТЬ ПО
	|	ВопросыШаблонаАнкеты.Ссылка ИЕРАРХИЯ";

	Запрос.УстановитьПараметр("Владелец", ШаблонАнкеты);

	Возврат Запрос.Выполнить();

КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Формирование формы заполнения анкеты.

// Параметры:
//  Форма                       - см. Документ.Анкета.Форма.ФормаДокумента
//                              - см. ОбщаяФорма.МастерАнкетыПоРазделам
//  ТекущиеДанныеДеревоРазделов - ДанныеФормыЭлементДерева - текущий раздел, для которого строится форма заполнения, где:
//   * Ссылка - СправочникСсылка.ВопросыШаблонаАнкеты
//
Процедура ПостроениеФормыЗаполненияПоРазделу(Форма, ТекущиеДанныеДеревоРазделов) Экспорт

	ДобавляемыеРеквизиты = Новый Массив;
	Форма.ТаблицаВопросовРаздела.Очистить();

	ЭлементНадписьВступление = Форма.Элементы.НадписьВступление; //ПолеФормы
	Если ТекущиеДанныеДеревоРазделов.ТипСтроки = "Раздел" Тогда

		ЭлементНадписьВступление.Заголовок  = НСтр("ru = 'Раздел'") + " " + ТекущиеДанныеДеревоРазделов.Формулировка;
		ЭлементНадписьВступление.ЦветТекста =  ЦветаСтиля.ЦветРазделаПанелиФункций;
		ЭлементНадписьВступление.Шрифт = ШрифтыСтиля.КрупныйШрифтТекста;

		Раздел = ТекущиеДанныеДеревоРазделов.Ссылка;
		ПолныйКодРаздела = ТекущиеДанныеДеревоРазделов.ПолныйКод;
		
		// получение вопросов раздела
		Форма.ТаблицаВопросовРаздела.Очистить();
		ПолучитьИнформациюПоВопросамАнкеты(Форма, Форма.ШаблонАнкеты, Раздел, ПолныйКодРаздела);
		СформироватьДобавляемыеРеквизитыДляРаздела(ДобавляемыеРеквизиты, Форма);

	Иначе

		Вступление = ?(ПустаяСтрока(Форма.Вступление), НСтр("ru = 'Нажмите далее для заполнения анкеты.'"),
			Форма.Вступление);
		Заключение = ?(ПустаяСтрока(Форма.Заключение), НСтр("ru = 'Спасибо за то что заполнили анкету.'"),
			Форма.Заключение);

		ЭлементНадписьВступление.Заголовок = ?(ТекущиеДанныеДеревоРазделов.ТипСтроки = "Вступление", Вступление,
			Заключение);
		ЭлементНадписьВступление.ЦветТекста = ЦветаСтиля.ЦветТекстаПоля;
		ЭлементНадписьВступление.Шрифт = ШрифтыСтиля.КрупныйШрифтТекста;

	КонецЕсли;

	Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты, Форма.ДобавленныеДинамическиРеквизиты.ВыгрузитьЗначения());
	
	// Удаление ранее динамически сформированных элементов формы.
	УдалитьЭлементыФормыЗаполнения(Форма, Форма.ДобавленныеДинамическиРеквизиты);
	Форма.ДобавленныеДинамическиРеквизиты.Очистить();
	Для Каждого ДобавленныйРеквизит Из ДобавляемыеРеквизиты Цикл
		Если ПустаяСтрока(ДобавленныйРеквизит.Путь) Тогда
			Форма.ДобавленныеДинамическиРеквизиты.Добавить(ДобавленныйРеквизит.Имя);
		КонецЕсли;
	КонецЦикла;

	Если ТекущиеДанныеДеревоРазделов.ТипСтроки = "Раздел" Тогда
		// добавление элементов формы
		СформироватьЭлементыФормыДляРаздела(Форма);
	КонецЕсли;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Создание реквизитов формы заполнения анкеты.

// Параметры:
//  ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования создаваемых реквизитов формы.
//  Форма                - ФормаКлиентскогоПриложения - форма, для которой формируется массив реквизитов.
//
Процедура СформироватьДобавляемыеРеквизитыДляРаздела(ДобавляемыеРеквизиты, Форма)

	Для Каждого Строка Из Форма.ТаблицаВопросовРаздела Цикл

		ДобавитьРеквизитыДляВопроса(Строка, ДобавляемыеРеквизиты, Форма);

	КонецЦикла;

КонецПроцедуры

// Параметры:
//  СтрокаДерева         - СтрокаДереваЗначений - строка дерева шаблона анкеты.
//  ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования добавляемых реквизитов формы.
//
Процедура ДобавитьРеквизитыДляВопроса(СтрокаДерева, ДобавляемыеРеквизиты, Форма)

	ИмяВопроса = АнкетированиеКлиентСервер.ИмяВопроса(СтрокаДерева.КлючСтроки);

	ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка");
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Формулировка", ОписаниеТипаСтроки));

	Если СтрокаДерева.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда
		ДобавитьРеквизитыТабличныйВопрос(СтрокаДерева, ДобавляемыеРеквизиты, Форма);
	ИначеЕсли СтрокаДерева.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Комплексный Тогда
		ДобавитьРеквизитыКомплексныйВопрос(СтрокаДерева, ДобавляемыеРеквизиты, Форма);
	Иначе

		Если СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Строка Или СтрокаДерева.ТипОтвета
			= Перечисления.ТипыОтветовНаВопрос.Текст Тогда

			ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(СтрокаДерева.Длина));
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса, ОписаниеТипаСтроки, ,
				СтрокаДерева.Формулировка));

		ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда
			ОписаниеТипаБулево = Новый ОписаниеТипов("Булево");
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса, ОписаниеТипаБулево, ,
				СтрокаДерева.Формулировка));
		ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Дата Тогда
			ОписаниеТипаДата = Новый ОписаниеТипов("Дата", Новый КвалификаторыДаты(ЧастиДаты.Дата));
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса, ОписаниеТипаДата, ,
				СтрокаДерева.Формулировка));
		ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда

			ОписаниеТипаЧисло = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(СтрокаДерева.Длина,
				СтрокаДерева.Точность));
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса, ОписаниеТипаЧисло, ,
				СтрокаДерева.Формулировка));

			Если СтрокаДерева.ПоказыватьПолосуРегулирования Тогда
				ОписаниеТипаЧисло = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15, 2));
				ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_ПолосаРегулированияРеквизит",
					ОписаниеТипаЧисло, , СтрокаДерева.Формулировка));
			КонецЕсли;

		ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда

			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса, СтрокаДерева.ТипЗначения, ,
				СтрокаДерева.Формулировка));

		ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз Тогда

			Если СтрокаДерева.ВидПереключателя = Перечисления.ВидыПереключателяВАнкетах.Переключатель Тогда
				ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос, Форма);
				Счетчик = 0;
				Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл
					Счетчик = Счетчик + 1;
					ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Реквизит_" + Счетчик,
						СтрокаДерева.ТипЗначения, , СтрокаДерева.Формулировка));
					КонецЦикла;
			Иначе
				ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,СтрокаДерева.ТипЗначения,,СтрокаДерева.Формулировка))
			КонецЕсли;

		ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда
			ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаДерева.ЭлементарныйВопрос, Форма);
			ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150));
			ОписаниеТипаБулево = Новый ОписаниеТипов("Булево");

			Счетчик = 0;

			Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл
				Счетчик = Счетчик + 1;
				ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Реквизит_" + Счетчик,
					ОписаниеТипаБулево, , ВариантОтвета.Представление));
				Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда
					ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Комментарий_" + Счетчик,
						ОписаниеТипаСтроки));
				КонецЕсли;
			КонецЦикла;

		КонецЕсли;

		Если (СтрокаДерева.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз)
			И (СтрокаДерева.ТребуетсяКомментарий) Тогда
			ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150));
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Комментарий", ОписаниеТипаСтроки, ,
				СтрокаДерева.ПояснениеКомментария));
		КонецЕсли;

		Если СтрокаДерева.ИспользоватьОтказОтОтвета Тогда
			ОписаниеТипаБулево = Новый ОписаниеТипов("Булево");
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_ИспользоватьОтказОтОтвета",
				ОписаниеТипаБулево, , СтрокаДерева.ФормулировкаОтказаОтОтвета));
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Параметры:
//  СтрокаДерева         - СтрокаДереваЗначений - строка дерева шаблона анкеты.
//  ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования добавляемых реквизитов формы.
//
Процедура ДобавитьРеквизитыТабличныйВопрос(СтрокаДерева, ДобавляемыеРеквизиты, Форма)

	ТипТабличногоВопроса = СтрокаДерева.ТипТабличногоВопроса;
	ИмяВопроса           = АнкетированиеКлиентСервер.ИмяВопроса(СтрокаДерева.КлючСтроки);
	ИмяТаблицы           = ИмяВопроса + "_Таблица";
	ИмяКолонкиБезНомера  = ИмяТаблицы + "_Колонка_";
	ОписаниеТиповПВХ     = Метаданные.ПланыВидовХарактеристик.ВопросыДляАнкетирования.Тип;

	РеквизитТаблица = Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений"), ,
		СтрокаДерева.Формулировка);
	ДобавляемыеРеквизиты.Добавить(РеквизитТаблица);

	Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Или ТипТабличногоВопроса
		= Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда

		Для инд = 1 По СтрокаДерева.СоставТабличногоВопроса.Количество() Цикл

			НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",
				СтрокаДерева.СоставТабличногоВопроса[инд - 1].ЭлементарныйВопрос));
			Если НайденныеСтроки.Количество() > 0 Тогда
				ПредставлениеТипВопроса = НайденныеСтроки[0];
			Иначе
				Продолжить;
			КонецЕсли;

			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + XMLСтрока(инд),
				ПредставлениеТипВопроса.Тип, ИмяТаблицы, ПредставлениеТипВопроса.Формулировка));

		КонецЦикла;

	ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда
		
		// Вопрос, ответы на который будут отображаться в колонках.
		ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос;
		// Добавим первую колонку в таблицу.
		ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",
			Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования"), ИмяТаблицы));
		
		// Добавим остальные колонки
		МассивОтветы = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",
			ВопросДляКолонок));
		Для инд = 1 По МассивОтветы.Количество() Цикл
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + XMLСтрока(инд + 1),
				ОписаниеТиповПВХ, ИмяТаблицы, МассивОтветы[инд - 1].Ответ));
		КонецЦикла;

	ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда
		
		// Вопрос, ответы на который будут отображаться в колонках.
		ВопросДляКолонок = СтрокаДерева.СоставТабличногоВопроса[1].ЭлементарныйВопрос;
		
		// Вопрос, который задает тип ячеек.
		ВопросДляЯчеек  = СтрокаДерева.СоставТабличногоВопроса[2].ЭлементарныйВопрос;
		НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос", ВопросДляЯчеек));
		Если НайденныеСтроки.Количество() > 0 Тогда
			ПредставлениеТипВопросаДляЯчеек = НайденныеСтроки[0];
		Иначе
			Возврат;
		КонецЕсли;
		
		// Вопрос, ответы на который будут отображаться в строках первой колонки.
		ВопросДляСтрок  = СтрокаДерева.СоставТабличногоВопроса[0].ЭлементарныйВопрос;
		НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос", ВопросДляСтрок));
		Если НайденныеСтроки.Количество() > 0 Тогда
			ПредставлениеТипВопросаДляСтрок = НайденныеСтроки[0];
		Иначе
			Возврат;
		КонецЕсли;
		// Добавим первую колонку в таблицу.
		ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + "1",
			ПредставлениеТипВопросаДляСтрок.Тип, ИмяТаблицы, ПредставлениеТипВопросаДляСтрок.Формулировка));
		
		// Добавим остальные колонки
		МассивОтветы = СтрокаДерева.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",
			ВопросДляКолонок));
		Для инд = 1 По МассивОтветы.Количество() Цикл
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонкиБезНомера + XMLСтрока(инд + 1),
				ПредставлениеТипВопросаДляЯчеек.Тип, ИмяТаблицы, МассивОтветы[инд - 1].Ответ));
		КонецЦикла;

	КонецЕсли;

КонецПроцедуры

// Параметры:
//  СтрокаДерева         - СтрокаДереваЗначений - строка дерева шаблона анкеты.
//  ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования добавляемых реквизитов формы.
//
Процедура ДобавитьРеквизитыКомплексныйВопрос(СтрокаДерева, ДобавляемыеРеквизиты, Форма)

	ИмяВопроса = АнкетированиеКлиентСервер.ИмяВопроса(СтрокаДерева.КлючСтроки);
	Для Каждого СтрокаКомплексногоВопроса Из СтрокаДерева.СоставКомплексногоВопроса Цикл // СтрокаТабличнойЧасти из см. СправочникТабличнаяЧасть.ВопросыШаблонаАнкеты.СоставКомплексногоВопроса

		НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",
			СтрокаКомплексногоВопроса.ЭлементарныйВопрос));
		Если НайденныеСтроки.Количество() > 0 Тогда
			ПредставлениеТипВопроса = НайденныеСтроки[0];
		Иначе
			Продолжить;
		КонецЕсли;

		Если ПредставлениеТипВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда

			ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос, Форма);

			ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150));
			ОписаниеТипаБулево = Новый ОписаниеТипов("Булево");

			Счетчик = 0;

			Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл

				Счетчик = Счетчик + 1;
				ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Ответ_" + Формат(
					СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=") + "_Реквизит_" + Счетчик, ОписаниеТипаБулево, ,
					ВариантОтвета.Представление));

				Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда
					ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Ответ_" + Формат(
						СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=") + "_Комментарий_" + Счетчик, ОписаниеТипаСтроки));
				КонецЕсли;

			КонецЦикла;

		Иначе

			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Ответ_" + Формат(
				СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ="), ПредставлениеТипВопроса.Тип, ,
				ПредставлениеТипВопроса.Формулировка));

		КонецЕсли;

		Если (ПредставлениеТипВопроса.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз)
			И (СтрокаКомплексногоВопроса.ТребуетсяКомментарий) Тогда

			ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150));
			ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса + "_Комментарий_" + Формат(
				СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ="), ОписаниеТипаСтроки, ,
				СтрокаКомплексногоВопроса.ПояснениеКомментария));

		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Создание элементов формы заполнения анкеты.

Процедура СформироватьЭлементыФормыДляРаздела(Форма)

	Для Каждого СтрокаТаблицы Из Форма.ТаблицаВопросовРаздела Цикл
		ДобавитьЭлементыФормыПоСтрокеТаблицы(СтрокаТаблицы, Форма.Элементы.ГруппаТелоАнкеты, Форма);
	КонецЦикла;
	СпозиционироватьсяНаПервомВопросеРаздела(Форма);

КонецПроцедуры

// Параметры:
//   Форма - см. Документ.Анкета.Форма.ФормаДокумента
//
Процедура СпозиционироватьсяНаПервомВопросеРаздела(Форма)

	Если Форма.ТаблицаВопросовРаздела.Количество() > 0 Тогда

		ИмяВопроса = АнкетированиеКлиентСервер.ИмяВопроса(Форма.ТаблицаВопросовРаздела[0].КлючСтроки);

		НайденныйЭлемент = Форма.Элементы.Найти(ИмяВопроса);
		Если НайденныйЭлемент = Неопределено Тогда
			НайденныйЭлемент = Форма.Элементы.Найти(ИмяВопроса + "_Реквизит_1");
		КонецЕсли;

		Если НайденныйЭлемент = Неопределено Тогда
			НайденныйЭлемент = Форма.Элементы.Найти(ИмяВопроса + "_Таблица");
		КонецЕсли;

		Если НайденныйЭлемент <> Неопределено Тогда
			Форма.ТекущийЭлемент = НайденныйЭлемент;
			НайденныйЭлемент.АктивизироватьПоУмолчанию = Истина;
			Форма.ИмяЭлементаДляПозиционирования = НайденныйЭлемент.Имя;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Параметры:
//  СтрокаДерева    - СтрокаДереваЗначений - строка дерева шаблона анкеты.
//  ЭлементГруппы   - ГруппаФормы          - группа формы, для которой будут подчиняться добавляемые реквизиты.
//  Форма           - ФормаКлиентскогоПриложения - форма, для которой добавляются элементы.
//
Процедура ДобавитьЭлементыФормыПоСтрокеТаблицы(СтрокаТаблицы, ЭлементГруппы, Форма)

	Если СтрокаТаблицы.ТипСтроки = "Раздел" Тогда
		ДобавитьЭлементыРаздел(СтрокаТаблицы, ЭлементГруппы, Форма);
	ИначеЕсли СтрокаТаблицы.ТипСтроки = "Вопрос" Тогда
		ДобавитьЭлементыВопрос(СтрокаТаблицы, ЭлементГруппы, Форма);
	КонецЕсли;

КонецПроцедуры

// Параметры:
//  СтрокаДерева    - СтрокаДереваЗначений - строка дерева шаблона анкеты.
//  ЭлементГруппы   - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты.
//  Форма           - ФормаКлиентскогоПриложения - форма, для которой добавляются элементы.
//
Процедура ДобавитьЭлементыРаздел(СтрокаТаблицы, ЭлементГруппы, Форма)

	ИмяРаздела = "Раздел_" + СтрЗаменить(СтрокаТаблицы.КлючСтроки, "-", "_");

	ЭлементРаздел = Форма.Элементы.Добавить(ИмяРаздела, Тип("ГруппаФормы"), ЭлементГруппы);
	ЭлементРаздел.Вид           = ВидГруппыФормы.ОбычнаяГруппа;
	ЭлементРаздел.Заголовок     = ПолныйКодНаименование(СтрокаТаблицы);
	ЭлементРаздел.Группировка   = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
	ЭлементРаздел.РастягиватьПоВертикали = Ложь;

КонецПроцедуры

// Параметры:
//  СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы вопросов раздела.
//  ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты.
//  Форма         - ФормаКлиентскогоПриложения - форма для которой добавляются элементы.
//
Процедура ДобавитьЭлементыВопрос(СтрокаТаблицы, ЭлементГруппа, Форма)

	ИмяВопроса = АнкетированиеКлиентСервер.ИмяВопроса(СтрокаТаблицы.КлючСтроки);
	
	// Зададим элемент группы для вопроса.
	ЭлементГруппаВопроса = Форма.Элементы.Добавить(ИмяВопроса + "_Группа", Тип("ГруппаФормы"), ЭлементГруппа);
	ЭлементГруппаВопроса.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
	ЭлементГруппаВопроса.ОтображатьЗаголовок        = Ложь;
	ЭлементГруппаВопроса.Отображение                = ОтображениеОбычнойГруппы.ОбычноеВыделение;
	ЭлементГруппаВопроса.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
	ЭлементГруппаВопроса.РастягиватьПоГоризонтали   = Истина;
	ЭлементГруппаВопроса.РастягиватьПоВертикали     = Ложь;

	Если СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда

		ЭлементГруппаВопросаБулево = Форма.Элементы.Добавить(
			ИмяВопроса + "_Группа_Булево", Тип("ГруппаФормы"), ЭлементГруппаВопроса);
		ЭлементГруппаВопросаБулево.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
		ЭлементГруппаВопросаБулево.ОтображатьЗаголовок        = Ложь;
		ЭлементГруппаВопросаБулево.Отображение                = ОтображениеОбычнойГруппы.Нет;
		ЭлементГруппаВопросаБулево.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
		ЭлементГруппаВопросаБулево.РастягиватьПоГоризонтали   = Истина;
		ЭлементГруппаВопросаБулево.РастягиватьПоВертикали     = Ложь;

	КонецЕсли;

	Форма[ИмяВопроса + "_Формулировка"] = ПолныйКодНаименование(СтрокаТаблицы);

	Если СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда
		Элемент = Форма.Элементы.Добавить(
			ИмяВопроса + "_Формулировка", Тип("ДекорацияФормы"), ЭлементГруппаВопросаБулево);
	Иначе
		Элемент = Форма.Элементы.Добавить(
			ИмяВопроса + "_Формулировка", Тип("ДекорацияФормы"), ЭлементГруппаВопроса); // РасширениеДекорацииФормыДляНадписи
	КонецЕсли;
	Элемент.Вид                      = ВидДекорацииФормы.Надпись;
	Элемент.ВертикальноеПоложение    = ВертикальноеПоложениеЭлемента.Верх;
	Элемент.Заголовок                = Форма[ИмяВопроса + "_Формулировка"];
	Элемент.АвтоМаксимальнаяШирина   = Ложь;
	Элемент.МаксимальнаяШирина       = 100;
	Элемент.РастягиватьПоГоризонтали = Ложь;
	Элемент.РастягиватьПоВертикали   = Ложь;
	Элемент.Подсказка                = СтрокаТаблицы.Подсказка;
	Элемент.Шрифт                    = ШрифтыСтиля.ВажнаяНадписьШрифт;

	Если СтрокаТаблицы.СпособОтображенияПодсказки = Перечисления.СпособыОтображенияПодсказок.ЗнакВопросаСправа Тогда
		Элемент.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
	Иначе
		Элемент.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСнизу;
	КонецЕсли;

	ЭлементГруппаВопросКомментарий = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_Вопрос_Комментарий", Тип(
		"ГруппаФормы"), ЭлементГруппаВопроса);
	ЭлементГруппаВопросКомментарий.Вид                 = ВидГруппыФормы.ОбычнаяГруппа;
	ЭлементГруппаВопросКомментарий.Отображение         = ОтображениеОбычнойГруппы.Нет;
	ЭлементГруппаВопросКомментарий.Группировка         = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
	ЭлементГруппаВопросКомментарий.ОтображатьЗаголовок = Ложь;

	Если СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда

		ДобавитьЭлементыТабличныйВопрос(СтрокаТаблицы, ЭлементГруппаВопроса, Форма);

	ИначеЕсли СтрокаТаблицы.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Комплексный Тогда

		ДобавитьЭлементыКомплексныйВопрос(СтрокаТаблицы, ЭлементГруппаВопроса, Форма);

	Иначе

		Если СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Строка
			Или СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса, Тип("ПолеФормы"), ЭлементГруппаВопросКомментарий);
			Элемент.Вид                        = ВидПоляФормы.ПолеВвода;
			Элемент.ПоложениеЗаголовка         = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.АвтоОтметкаНезаполненного  = СтрокаТаблицы.Обязательный;
			Элемент.ПутьКДанным                = ИмяВопроса;
			Элемент.АвтоМаксимальнаяШирина     = Ложь;
			Элемент.РастягиватьПоГоризонтали   = Ложь;

		ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса, Тип("ПолеФормы"), ЭлементГруппаВопросКомментарий);
			Элемент.Вид                       = ВидПоляФормы.ПолеВвода;
			Элемент.ПоложениеЗаголовка        = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный;
			Элемент.ПутьКДанным               = ИмяВопроса;
			Элемент.РастягиватьПоВертикали    = Ложь;
			Элемент.АвтоМаксимальнаяШирина    = Ложь;
			УстановитьПараметрыЭлементаЯчейкаТекст(Элемент);

		ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса, Тип("ПолеФормы"), ЭлементГруппаВопросаБулево);
			Если СтрокаТаблицы.ВидФлажка = Перечисления.ВидыФлажкаВАнкетах.Флажок Тогда
				Элемент.Вид = ВидПоляФормы.ПолеФлажка;
			Иначе
				Элемент.Вид = ВидПоляФормы.ПолеВвода;
			КонецЕсли;

			Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.ПутьКДанным        = ИмяВопроса;

		ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Дата Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса, Тип("ПолеФормы"), ЭлементГруппаВопросКомментарий);
			Элемент.Вид                       = ВидПоляФормы.ПолеВвода;
			Элемент.ПоложениеЗаголовка        = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный;
			Элемент.ПутьКДанным               = ИмяВопроса;
			Элемент.АвтоМаксимальнаяШирина    = Ложь;

		ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса, Тип("ПолеФормы"), ЭлементГруппаВопросКомментарий);
			Элемент.Вид                       = ВидПоляФормы.ПолеВвода;
			Элемент.ПоложениеЗаголовка        = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный
				И Не РазрешенВводНулевогоЗначенияВЧисловоеПоле(СтрокаТаблицы);
			Элемент.МинимальноеЗначение       = ?(СтрокаТаблицы.ИспользоватьМинимальноеЗначение,
				СтрокаТаблицы.МинимальноеЗначение, Неопределено);
			Элемент.МаксимальноеЗначение      = ?(СтрокаТаблицы.ИспользоватьМаксимальноеЗначение,
				СтрокаТаблицы.МаксимальноеЗначение, Неопределено);
			Элемент.КнопкаВыбора              = Ложь;
			Элемент.ПутьКДанным               = ИмяВопроса;
			Элемент.АвтоМаксимальнаяШирина    = Ложь;
			Если СтрокаТаблицы.МинимальноеЗначение <> 0 Или СтрокаТаблицы.МаксимальноеЗначение <> 0 Тогда
				Элемент.КнопкаРегулирования = Истина;

				ТекстПодсказки = "";
				Если СтрокаТаблицы.ИспользоватьМинимальноеЗначение И СтрокаТаблицы.ИспользоватьМаксимальноеЗначение Тогда
					ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
						"ru = 'Допустим ввод значения от %1 до %2'"), СтрокаТаблицы.МинимальноеЗначение,
						СтрокаТаблицы.МаксимальноеЗначение);
				ИначеЕсли Не СтрокаТаблицы.ИспользоватьМинимальноеЗначение
					И СтрокаТаблицы.ИспользоватьМаксимальноеЗначение Тогда
					ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
						"ru = 'Допустим ввод значения до %1'"), СтрокаТаблицы.МаксимальноеЗначение);
				Иначе
					ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
						"ru = 'Допустим ввод значения от %1'"), СтрокаТаблицы.МинимальноеЗначение);
				КонецЕсли;

				Элемент.Подсказка = ТекстПодсказки;

			КонецЕсли;

			Если СтрокаТаблицы.ПоказыватьПолосуРегулирования Тогда

				ЭлементГруппаПолосаРегулирования = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_Вопрос_Полоса", Тип(
					"ГруппаФормы"), ЭлементГруппаВопроса);
				ЭлементГруппаПолосаРегулирования.Вид                 = ВидГруппыФормы.ОбычнаяГруппа;
				ЭлементГруппаПолосаРегулирования.Отображение         = ОтображениеОбычнойГруппы.Нет;
				ЭлементГруппаПолосаРегулирования.Группировка         = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
				ЭлементГруппаПолосаРегулирования.ОтображатьЗаголовок = Ложь;

				ЭлементПолоса = Форма.Элементы.Добавить(ИмяВопроса + "_ПолосаРегулирования", Тип("ПолеФормы"),
					ЭлементГруппаПолосаРегулирования);
				ЭлементПолоса.Вид = ВидПоляФормы.ПолеПолосыРегулирования;
				ЭлементПолоса.ОтображениеРазметки = ОтображениеРазметкиПолосыРегулирования.СОбоихСторон;
				ЭлементПолоса.ПоложениеЗаголовка        = ПоложениеЗаголовкаЭлементаФормы.Нет;
				ДлинаПолосы = СтрокаТаблицы.МаксимальноеЗначение - СтрокаТаблицы.МинимальноеЗначение;
				ЭлементПолоса.МинимальноеЗначение = 0;
				ЭлементПолоса.МаксимальноеЗначение = ДлинаПолосы / СтрокаТаблицы.ШагПолосыРегулирования;
				ЭлементПолоса.ШагРазметки = 1;
				ЭлементПолоса.Шаг = 1;
				ЭлементПолоса.БольшойШаг = 1;
				ЭлементПолоса.ПутьКДанным               = ИмяВопроса + "_ПолосаРегулированияРеквизит";
				ЭлементПолоса.РастягиватьПоГоризонтали = Ложь;
				ЭлементПолоса.ОтображениеРазметки = ОтображениеРазметкиПолосыРегулирования.СОбоихСторон;
				ЭлементПолоса.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииПолосыРегулирования");

				Форма.Элементы.Переместить(Элемент, ЭлементГруппаПолосаРегулирования);
				Форма.Элементы.Переместить(ЭлементГруппаВопросКомментарий, ЭлементГруппаВопроса);

				Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПриИзмененииПоляЧисло");
				Элемент.УстановитьДействие("Регулирование", "Подключаемый_РегулированиеПоляЧисло");

				ЭлементРасшифровка = Форма.Элементы.Добавить(
					ИмяВопроса + "_РасшифровкаПодсказки", Тип("ДекорацияФормы"), ЭлементГруппаПолосаРегулирования);
				ЭлементРасшифровка.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;

			Иначе

				ЭлементРасшифровка = Форма.Элементы.Добавить(
					ИмяВопроса + "_РасшифровкаПодсказки", Тип("ДекорацияФормы"), ЭлементГруппаВопросКомментарий);
				ЭлементРасшифровка.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
				ЭлементГруппаВопросКомментарий.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;

			КонецЕсли;

		ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз Тогда

			ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос, Форма);
			Если СтрокаТаблицы.ВидПереключателя = Перечисления.ВидыПереключателяВАнкетах.Переключатель Тогда
				ЭлементГруппаВариантыОтветов = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_Варианты", Тип("ГруппаФормы"),
					ЭлементГруппаВопросКомментарий);
				ЭлементГруппаВариантыОтветов.Вид                 = ВидГруппыФормы.ОбычнаяГруппа;
				ЭлементГруппаВариантыОтветов.Отображение         = ОтображениеОбычнойГруппы.Нет;
				ЭлементГруппаВариантыОтветов.Группировка         = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
				ЭлементГруппаВариантыОтветов.ОтображатьЗаголовок = Ложь;

				ЭлементГруппаВопросы = Форма.Элементы.Добавить(ИмяВопроса + "_ГруппаВопросы", Тип("ГруппаФормы"),
					ЭлементГруппаВариантыОтветов);
				ЭлементГруппаВопросы.Вид = ВидГруппыФормы.ОбычнаяГруппа;
				ЭлементГруппаВопросы.Отображение = ОтображениеОбычнойГруппы.Нет;
				ЭлементГруппаВопросы.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
				ЭлементГруппаВопросы.ОтображатьЗаголовок = Ложь;
				
				Счетчик = 0;
				Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл

					Счетчик = Счетчик + 1;

					ЭлементГруппаВариантОтвета = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_ВариантОтвета_" + XMLСтрока(
						Счетчик), Тип("ГруппаФормы"), ЭлементГруппаВопросы);

					ЭлементГруппаВариантОтвета.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
					ЭлементГруппаВариантОтвета.Отображение                = ОтображениеОбычнойГруппы.Нет;
					ЭлементГруппаВариантОтвета.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
					ЭлементГруппаВариантОтвета.ОтображатьЗаголовок        = Ложь;
					ЭлементГруппаВариантОтвета.РастягиватьПоГоризонтали   = Истина;

					ИмяРеквизитаВопроса = ИмяВопроса + "_Реквизит_" + Счетчик;
					Элемент = Форма.Элементы.Добавить(ИмяРеквизитаВопроса, Тип("ПолеФормы"), ЭлементГруппаВариантОтвета);
					Элемент.Вид                     = ВидПоляФормы.ПолеПереключателя;
					Элемент.ПоложениеЗаголовка      = ПоложениеЗаголовкаЭлементаФормы.Нет;
					Элемент.ПутьКДанным             = ИмяРеквизитаВопроса;
					Элемент.КоличествоКолонок       = 1;
					Элемент.ВысотаЭлемента          = 1;
					Элемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево;
					Элемент.ВидПереключателя = ВидПереключателя.Переключатель;
					Элемент.КоличествоКолонок = 1;
					Элемент.Подсказка          = ВариантОтвета.Подсказка;

					СписокВыбораЭлемента = Элемент.СписокВыбора;
					СписокВыбораЭлемента.Добавить(ВариантОтвета.Ответ, ВариантОтвета.Представление);

				КонецЦикла;

				ЭлементГруппаПодсказка = Форма.Элементы.Добавить(ИмяВопроса + "_ГруппаПодсказка", Тип("ГруппаФормы"),
					ЭлементГруппаВариантыОтветов);
				ЭлементГруппаПодсказка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
				ЭлементГруппаПодсказка.Отображение = ОтображениеОбычнойГруппы.Нет;
				ЭлементГруппаПодсказка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
				ЭлементГруппаПодсказка.ОтображатьЗаголовок = Ложь;

				ЭлементРасшифровка = Форма.Элементы.Добавить(
					ИмяВопроса + "_РасшифровкаПодсказки", Тип("ДекорацияФормы"), ЭлементГруппаПодсказка);
				ЭлементРасшифровка.АвтоМаксимальнаяШирина = Ложь;
				ЭлементРасшифровка.РастягиватьПоГоризонтали = Истина;
				ЭлементРасшифровка.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
			
			Иначе
			
				Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий);
				Элемент.Вид                     = ВидПоляФормы.ПолеПереключателя;
				Элемент.ПоложениеЗаголовка      = ПоложениеЗаголовкаЭлементаФормы.Нет;
				Элемент.ПутьКДанным             = ИмяВопроса;
				Элемент.КоличествоКолонок       = 1;
				Элемент.ВысотаЭлемента          = 1;
				Элемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево;
				Элемент.ВидПереключателя = ВидПереключателя.Тумблер;
				Элемент.КоличествоКолонок = 0;
				Элемент.ОдинаковаяШиринаКолонок = Ложь;
				
				Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл
					СписокВыбораЭлемента = Элемент.СписокВыбора;
					СписокВыбораЭлемента.Добавить(ВариантОтвета.Ответ,ВариантОтвета.Представление);
				КонецЦикла;
			
			КонецЕсли;

		ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда

			ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаТаблицы.ЭлементарныйВопрос, Форма);
			Счетчик = 0;

			ЭлементГруппаВариантыОтветов = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_Варианты", Тип("ГруппаФормы"),
				ЭлементГруппаВопросКомментарий);

			ЭлементГруппаВариантыОтветов.Вид                 = ВидГруппыФормы.ОбычнаяГруппа;
			ЭлементГруппаВариантыОтветов.Отображение         = ОтображениеОбычнойГруппы.Нет;
			ЭлементГруппаВариантыОтветов.Группировка         = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
			ЭлементГруппаВариантыОтветов.ОтображатьЗаголовок = Ложь;

			Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл

				Счетчик = Счетчик + 1;

				ЭлементГруппаВариантОтвета = Форма.Элементы.Добавить(ИмяВопроса + "_Группа_ВариантОтвета_" + XMLСтрока(
					Счетчик), Тип("ГруппаФормы"), ЭлементГруппаВариантыОтветов);

				ЭлементГруппаВариантОтвета.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
				ЭлементГруппаВариантОтвета.Отображение                = ОтображениеОбычнойГруппы.Нет;
				ЭлементГруппаВариантОтвета.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
				ЭлементГруппаВариантОтвета.ОтображатьЗаголовок        = Ложь;
				ЭлементГруппаВариантОтвета.РастягиватьПоГоризонтали   = Истина;

				ИмяРеквизитаВопроса = ИмяВопроса + "_Реквизит_" + Счетчик;
				Элемент = Форма.Элементы.Добавить(ИмяРеквизитаВопроса, Тип("ПолеФормы"), ЭлементГруппаВариантОтвета);

				Элемент.Вид                = ВидПоляФормы.ПолеФлажка;
				Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
				Элемент.ПутьКДанным        = ИмяРеквизитаВопроса;
				Элемент.ВысотаЗаголовка    = 1;
				Элемент.Подсказка          = ВариантОтвета.Подсказка;

				Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда
					ИмяРеквизитаКомментария = ИмяВопроса + "_Комментарий_" + Счетчик;
					Элемент = Форма.Элементы.Добавить(ИмяРеквизитаКомментария, Тип("ПолеФормы"),
						ЭлементГруппаВариантОтвета);
					Элемент.Вид 		= ВидПоляФормы.ПолеФлажка;
					Элемент.ПутьКДанным	= ИмяРеквизитаКомментария;
					Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
				КонецЕсли;

			КонецЦикла;

		КонецЕсли;

		Если СтрокаТаблицы.ИспользоватьОтказОтОтвета И СтрокаТаблицы.ТипОтвета
			<> Перечисления.ТипыОтветовНаВопрос.Булево Тогда
			Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_ИспользоватьОтказОтОтвета", Тип("ПолеФормы"),
				ЭлементГруппаВопроса);
			Элемент.Вид = ВидПоляФормы.ПолеФлажка;
			Элемент.ПутьКДанным = ИмяВопроса + "_ИспользоватьОтказОтОтвета";
			Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
		КонецЕсли;
		
		Если (СтрокаТаблицы.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз)
			И (СтрокаТаблицы.ТребуетсяКомментарий) Тогда

			Элемент                        = Форма.Элементы.Добавить(ИмяВопроса + "_Комментарий", Тип("ПолеФормы"),
				ЭлементГруппаВопросКомментарий);
			Элемент.Вид                    = ВидПоляФормы.ПолеВвода;
			Элемент.ПутьКДанным            = ИмяВопроса + "_Комментарий";
			Элемент.АвтоМаксимальнаяШирина = Ложь;
			Элемент.ПодсказкаВвода = СтрокаТаблицы.ПояснениеКомментария;
			Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.РастягиватьПоГоризонтали = Ложь;
			Элемент.КнопкаВыбора = Истина;
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

// Параметры:
//  СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы вопросов раздела.
//  ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты.
//  Форма         - ФормаКлиентскогоПриложения
//
Процедура ДобавитьЭлементыТабличныйВопрос(СтрокаТаблицы, ЭлементГруппа, Форма)

	ТипТабличногоВопроса = СтрокаТаблицы.ТипТабличногоВопроса;
	ИмяВопроса = АнкетированиеКлиентСервер.ИмяВопроса(СтрокаТаблицы.КлючСтроки);
	ИмяТаблицы = ИмяВопроса + "_Таблица";
	
	ЭлементТаблица = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), ЭлементГруппа);

	Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Тогда
		ЭлементТаблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Верх;
	Иначе
		ЭлементТаблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
		ЭлементТаблица.ИзменятьСоставСтрок  = Ложь;
		ЭлементТаблица.ИзменятьПорядокСтрок = Ложь;
	КонецЕсли;
	ЭлементТаблица.ПоложениеЗаголовка       = ПоложениеЗаголовкаЭлементаФормы.Нет;
	ЭлементТаблица.ПутьКДанным              = ИмяТаблицы;
	ЭлементТаблица.РастягиватьПоГоризонтали = Истина;
	ЭлементТаблица.РастягиватьПоВертикали   = Ложь;
	
	ТаблицаВопроса = Форма.РеквизитФормыВЗначение(ИмяТаблицы);

	Если СтрокаТаблицы.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках
		И СтрокаТаблицы.СоставТабличногоВопроса.Количество() = 3 Тогда

		НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",
			СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос));
		Если НайденныеСтроки.Количество() > 0 Тогда
			РеквизитыЭлементарногоВопроса = НайденныеСтроки[0];
		Иначе
			Возврат;
		КонецЕсли;

	ИначеЕсли СтрокаТаблицы.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках
		И СтрокаТаблицы.СоставТабличногоВопроса.Количество() > 1 Тогда

	КонецЕсли;

	Для инд = 1 По ТаблицаВопроса.Колонки.Количество() Цикл

		ИмяКолонки = ИмяТаблицы + "_Колонка_" + инд;

		Если СтрокаТаблицы.ТипТабличногоВопроса <> Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках
			И СтрокаТаблицы.ТипТабличногоВопроса <> Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда
			НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",
				СтрокаТаблицы.СоставТабличногоВопроса[инд - 1].ЭлементарныйВопрос));
			Если НайденныеСтроки.Количество() > 0 Тогда
				РеквизитыЭлементарногоВопроса = НайденныеСтроки[0];
			Иначе
				Продолжить;
			КонецЕсли;
		КонецЕсли;

		Элемент = Форма.Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), Форма.Элементы[ИмяТаблицы]); // ПолеФормы
		Элемент.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;

		Если ТаблицаВопроса.Колонки[ИмяКолонки].ТипЗначения = Новый ОписаниеТипов("Булево") Тогда
			Элемент.Вид = ВидПоляФормы.ПолеФлажка;
		Иначе
			Элемент.Вид = ВидПоляФормы.ПолеВвода;
			
			// Установка списка выборка для тех колонок, тип ответа которых "Варианты ответов анкет" и ограничения для числовых
			// вопросов.
			Если СтрокаТаблицы.ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.Составной Или СтрокаТаблицы.ТипТабличногоВопроса
				= Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках Тогда

				Если ТаблицаВопроса.Колонки[ИмяКолонки].ТипЗначения
					= Новый ОписаниеТипов("СправочникСсылка.ВариантыОтветовАнкет") Тогда

					Элемент.РежимВыбораИзСписка = Истина;
					ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаТаблицы.СоставТабличногоВопроса[инд
						- 1].ЭлементарныйВопрос, Форма);
					Для Каждого ВариантОтветаНаВопрос Из ВариантыОтветовНаВопрос Цикл
						СписокВыбораЭлемента = Элемент.СписокВыбора; // СписокЗначений
						СписокВыбораЭлемента.Добавить(ВариантОтветаНаВопрос.Ответ);
					КонецЦикла;
					Элемент.КнопкаОткрытия = Ложь;

				ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда
					УстановитьПараметрыЭлементаЯчейкаЧисло(Элемент, РеквизитыЭлементарногоВопроса);
				ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда
					УстановитьПараметрыЭлементаЯчейкаТекст(Элемент);
				КонецЕсли;

			ИначеЕсли СтрокаТаблицы.ТипТабличногоВопроса
				= Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда

				Если СтрокаТаблицы.СоставТабличногоВопроса.Количество() = 3 И инд <> 1 Тогда

					ТипЗначения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос, 
						"ТипЗначения");
					Если ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ВариантыОтветовАнкет") Тогда

						Элемент.РежимВыбораИзСписка = Истина;
						ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(
							СтрокаТаблицы.СоставТабличногоВопроса[2].ЭлементарныйВопрос, Форма);
						Для Каждого ВариантОтветаНаВопрос Из ВариантыОтветовНаВопрос Цикл
							СписокВыбораЭлемента = Элемент.СписокВыбора; // СписокЗначений
							СписокВыбораЭлемента.Добавить(ВариантОтветаНаВопрос.Ответ);
						КонецЦикла;
						Элемент.КнопкаОткрытия = Ложь;

					КонецЕсли;

					Если РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда
						УстановитьПараметрыЭлементаЯчейкаЧисло(Элемент, РеквизитыЭлементарногоВопроса);
					ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда
						УстановитьПараметрыЭлементаЯчейкаТекст(Элемент);
					КонецЕсли;

				КонецЕсли;

			КонецЕсли;
		КонецЕсли;

		Элемент.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки;

		Если (ТипТабличногоВопроса <> Перечисления.ТипыТабличныхВопросов.Составной) И (инд = 1) Тогда
			Элемент.Доступность = Ложь;
		КонецЕсли;

		Если (ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках) Тогда
			Если инд = 1 Тогда
				Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Иначе
				Элемент.СвязьПоТипу = Новый СвязьПоТипу("Элементы." + ИмяТаблицы + ".ТекущиеДанные." + ИмяТаблицы
					+ "_Колонка_1");
				СвязиПараметровВыбора = Новый Массив;
				СвязиПараметровВыбора.Добавить(Новый СвязьПараметраВыбора("Отбор.Владелец", "Элементы." + ИмяТаблицы
					+ ".ТекущиеДанные." + ИмяТаблицы + "_Колонка_1"));
				Элемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(СвязиПараметровВыбора);
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;
	
	Если ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтроках 
		Или ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках Тогда

		МассивОтветы = СтрокаТаблицы.ПредопределенныеОтветы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",
			СтрокаТаблицы.СоставТабличногоВопроса[0].ЭлементарныйВопрос));

		Для Каждого СтрокаОтвет Из МассивОтветы Цикл

			НоваяСтрока = ТаблицаВопроса.Добавить();
			НоваяСтрока[ИмяТаблицы + "_Колонка_1"] = СтрокаОтвет.Ответ;

		КонецЦикла;

	ИначеЕсли ТипТабличногоВопроса = Перечисления.ТипыТабличныхВопросов.ПредопределенныеОтветыВКолонках Тогда

		Для инд = 2 По СтрокаТаблицы.СоставТабличногоВопроса.Количество() Цикл

			НоваяСтрока = ТаблицаВопроса.Добавить();
			НоваяСтрока[ИмяТаблицы + "_Колонка_1"] = СтрокаТаблицы.СоставТабличногоВопроса[инд - 1].ЭлементарныйВопрос;

		КонецЦикла;

	КонецЕсли;

	Если ТипТабличногоВопроса <> Перечисления.ТипыТабличныхВопросов.Составной Тогда
		ЭлементТаблица.ВысотаВСтрокахТаблицы = ТаблицаВопроса.Количество() + 1;
	КонецЕсли;

	Форма.ЗначениеВРеквизитФормы(ТаблицаВопроса, ИмяТаблицы);

КонецПроцедуры

// Параметры:
//  СтрокаТаблицы - ДанныеФормыЭлементКоллекции
//  ЭлементГруппа - ГруппаФормы
//  Форма - ФормаКлиентскогоПриложения
//
Процедура ДобавитьЭлементыКомплексныйВопрос(СтрокаТаблицы, ЭлементГруппа, Форма)

	ИмяВопроса = АнкетированиеКлиентСервер.ИмяВопроса(СтрокаТаблицы.КлючСтроки);
	Для Каждого СтрокаКомплексногоВопроса Из СтрокаТаблицы.СоставКомплексногоВопроса Цикл // СтрокаТабличнойЧасти из см. СправочникТабличнаяЧасть.ВопросыШаблонаАнкеты.СоставКомплексногоВопроса

		НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",
			СтрокаКомплексногоВопроса.ЭлементарныйВопрос));
		Если НайденныеСтроки.Количество() > 0 Тогда
			РеквизитыЭлементарногоВопроса = НайденныеСтроки[0];
		Иначе
			Продолжить;
		КонецЕсли;

		Если РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда

			ЭлементГруппаВопросаБулево = Форма.Элементы.Добавить(
				ИмяВопроса + "_ЭлементарныйВопрос_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=")
				+ "_ГруппаБулево", Тип("ГруппаФормы"), ЭлементГруппа);

			ЭлементГруппаВопросаБулево.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
			ЭлементГруппаВопросаБулево.ОтображатьЗаголовок        = Ложь;
			ЭлементГруппаВопросаБулево.Отображение                = ОтображениеОбычнойГруппы.Нет;
			ЭлементГруппаВопросаБулево.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
			ЭлементГруппаВопросаБулево.РастягиватьПоГоризонтали   = Истина;
			ЭлементГруппаВопросаБулево.РастягиватьПоВертикали     = Ложь;
		КонецЕсли;

		Если РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда
			Элемент = Форма.Элементы.Добавить(
				ИмяВопроса + "_ЭлементарныйВопрос_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ="), Тип(
				"ДекорацияФормы"), ЭлементГруппаВопросаБулево);
		Иначе
			Элемент = Форма.Элементы.Добавить(
				ИмяВопроса + "_ЭлементарныйВопрос_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ="), Тип(
				"ДекорацияФормы"), ЭлементГруппа);
		КонецЕсли;
		Элемент.Вид                        = ВидДекорацииФормы.Надпись;
		Элемент.Заголовок                  = СтрокаКомплексногоВопроса.ЭлементарныйВопрос;
		Элемент.АвтоМаксимальнаяШирина     = Ложь;
		Элемент.РастягиватьПоГоризонтали   = (РеквизитыЭлементарногоВопроса.ТипОтвета
			<> Перечисления.ТипыОтветовНаВопрос.Булево);
		Элемент.Шрифт = ШрифтыСтиля.МелкийШрифтТекста;

		Если РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Строка 
			Или СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ="), Тип("ПолеФормы"), ЭлементГруппа);
			Элемент.Вид                        = ВидПоляФормы.ПолеВвода;
			Элемент.ПоложениеЗаголовка         = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.АвтоОтметкаНезаполненного  = СтрокаТаблицы.Обязательный;
			Элемент.ПутьКДанным                = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ=");
			Элемент.АвтоМаксимальнаяШирина     = Ложь;
			Элемент.РастягиватьПоГоризонтали   = Ложь;

		ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Текст Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ="), Тип("ПолеФормы"), ЭлементГруппа);
			Элемент.Вид                       = ВидПоляФормы.ПолеВвода;
			Элемент.ПоложениеЗаголовка        = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный;
			Элемент.ПутьКДанным               = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ=");
			Элемент.РастягиватьПоВертикали    = Ложь;
			Элемент.АвтоМаксимальнаяШирина    = Ложь;
			УстановитьПараметрыЭлементаЯчейкаТекст(Элемент);

		ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Булево Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ="), Тип("ПолеФормы"), ЭлементГруппаВопросаБулево);
			Если РеквизитыЭлементарногоВопроса.ВидФлажка = Перечисления.ВидыФлажкаВАнкетах.Флажок Тогда
				Элемент.Вид = ВидПоляФормы.ПолеФлажка;
			Иначе
				Элемент.Вид = ВидПоляФормы.ПолеВвода;
			КонецЕсли;

			Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.ПутьКДанным        = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=");

		ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Дата Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ="), Тип("ПолеФормы"), ЭлементГруппа);
			Элемент.Вид                       = ВидПоляФормы.ПолеВвода;
			Элемент.ПоложениеЗаголовка        = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный;
			Элемент.ПутьКДанным               = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ=");
			Элемент.АвтоМаксимальнаяШирина    = Ложь;

		ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.Число Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ="), Тип("ПолеФормы"), ЭлементГруппа);
			Элемент.Вид                       = ВидПоляФормы.ПолеВвода;
			Элемент.ПоложениеЗаголовка        = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный
				И Не РазрешенВводНулевогоЗначенияВЧисловоеПоле(СтрокаТаблицы);
			Элемент.МинимальноеЗначение       = ?(РеквизитыЭлементарногоВопроса.ИспользоватьМинимальноеЗначение,
				РеквизитыЭлементарногоВопроса.МинимальноеЗначение, Неопределено);
			Элемент.МаксимальноеЗначение      = ?(РеквизитыЭлементарногоВопроса.ИспользоватьМаксимальноеЗначение,
				РеквизитыЭлементарногоВопроса.МаксимальноеЗначение, Неопределено);
			Элемент.КнопкаВыбора              = Ложь;
			Элемент.ПутьКДанным               = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ=");
			Элемент.АвтоМаксимальнаяШирина    = Ложь;
			Если РеквизитыЭлементарногоВопроса.МинимальноеЗначение <> 0
				Или РеквизитыЭлементарногоВопроса.МаксимальноеЗначение <> 0 Тогда
				Элемент.КнопкаРегулирования = Истина;

				ТекстПодсказки = "";
				Если РеквизитыЭлементарногоВопроса.ИспользоватьМинимальноеЗначение
					И РеквизитыЭлементарногоВопроса.ИспользоватьМаксимальноеЗначение Тогда
					ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
						"ru = 'Допустим ввод значения от %1 до %2'"),
						РеквизитыЭлементарногоВопроса.ИспользоватьМинимальноеЗначение,
						РеквизитыЭлементарногоВопроса.МаксимальноеЗначение);
				ИначеЕсли Не РеквизитыЭлементарногоВопроса.ИспользоватьМинимальноеЗначение
					И РеквизитыЭлементарногоВопроса.ИспользоватьМаксимальноеЗначение Тогда
					ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
						"ru = 'Допустим ввод значения до %1'"), РеквизитыЭлементарногоВопроса.МаксимальноеЗначение);
				Иначе
					ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
						"ru = 'Допустим ввод значения от %1'"), РеквизитыЭлементарногоВопроса.МинимальноеЗначение);
				КонецЕсли;

				Элемент.Подсказка = ТекстПодсказки;

			КонецЕсли;

		ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ОдинВариантИз Тогда

			ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос, Форма);

			Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ="), Тип("ПолеФормы"), ЭлементГруппа);
			Элемент.Вид                     = ВидПоляФормы.ПолеПереключателя;
			Элемент.ПоложениеЗаголовка      = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.ПутьКДанным             = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
				"ЧГ=");
			Элемент.ВысотаЭлемента          = 1;
			Элемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево;

			Если РеквизитыЭлементарногоВопроса.ВидПереключателя = Перечисления.ВидыПереключателяВАнкетах.Тумблер Тогда
				Элемент.ВидПереключателя = ВидПереключателя.Тумблер;
				Элемент.КоличествоКолонок = 0;
				Элемент.ОдинаковаяШиринаКолонок = Ложь;
			Иначе
				Элемент.ВидПереключателя = ВидПереключателя.Переключатель;
				Элемент.КоличествоКолонок = 1;
			КонецЕсли;

			Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл
				Элемент.СписокВыбора.Добавить(ВариантОтвета.Ответ, ВариантОтвета.Представление);
			КонецЦикла;

		ИначеЕсли РеквизитыЭлементарногоВопроса.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда

			ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(СтрокаКомплексногоВопроса.ЭлементарныйВопрос, Форма);
			Счетчик = 0;

			ЭлементГруппаВариантыОтветов = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(
				СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=") + "_Группа_Варианты", Тип("ГруппаФормы"), ЭлементГруппа);

			ЭлементГруппаВариантыОтветов.Вид                 = ВидГруппыФормы.ОбычнаяГруппа;
			ЭлементГруппаВариантыОтветов.Отображение         = ОтображениеОбычнойГруппы.Нет;
			ЭлементГруппаВариантыОтветов.Группировка         = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
			ЭлементГруппаВариантыОтветов.ОтображатьЗаголовок = Ложь;

			Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл

				Счетчик = Счетчик + 1;

				ЭлементГруппаВариантОтвета = Форма.Элементы.Добавить(ИмяВопроса + "_Ответ_" + Формат(
					СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=") + "_Группа_ВариантОтвета_" + XMLСтрока(Счетчик), Тип(
					"ГруппаФормы"), ЭлементГруппаВариантыОтветов);

				ЭлементГруппаВариантОтвета.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
				ЭлементГруппаВариантОтвета.Отображение                = ОтображениеОбычнойГруппы.Нет;
				ЭлементГруппаВариантОтвета.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
				ЭлементГруппаВариантОтвета.ОтображатьЗаголовок        = Ложь;
				ЭлементГруппаВариантОтвета.РастягиватьПоГоризонтали   = Истина;

				ИмяРеквизитаВопроса = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=")
					+ "_Реквизит_" + Счетчик;
				Элемент = Форма.Элементы.Добавить(ИмяРеквизитаВопроса, Тип("ПолеФормы"), ЭлементГруппаВариантОтвета);

				Элемент.Вид                = ВидПоляФормы.ПолеФлажка;
				Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
				Элемент.ПутьКДанным        = ИмяРеквизитаВопроса;
				Элемент.ВысотаЗаголовка    = 1;

				Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда
					ИмяРеквизитаКомментария = ИмяВопроса + "_Ответ_" + Формат(СтрокаКомплексногоВопроса.НомерСтроки,
						"ЧГ=") + "_Комментарий_" + Счетчик;
					Элемент = Форма.Элементы.Добавить(ИмяРеквизитаКомментария, Тип("ПолеФормы"),
						ЭлементГруппаВариантОтвета);
					Элемент.Вид 		= ВидПоляФормы.ПолеФлажка;
					Элемент.ПутьКДанным	= ИмяРеквизитаКомментария;
					Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
				КонецЕсли;

			КонецЦикла;

		КонецЕсли;
		
		Если (РеквизитыЭлементарногоВопроса.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз)
			И (СтрокаКомплексногоВопроса.ТребуетсяКомментарий) Тогда

			Элемент = Форма.Элементы.Добавить(ИмяВопроса + "_Комментарий_" + Формат(
				СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ="), Тип("ПолеФормы"), ЭлементГруппа);

			Элемент.Вид                    = ВидПоляФормы.ПолеВвода;
			Элемент.ПутьКДанным            = ИмяВопроса + "_Комментарий_" + Формат(
				СтрокаКомплексногоВопроса.НомерСтроки, "ЧГ=");
			Элемент.АвтоМаксимальнаяШирина = Ложь;
			ПояснениеКомментария = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаКомплексногоВопроса.ЭлементарныйВопрос, 
				"ПояснениеКомментария");
			Элемент.ПодсказкаВвода = ПояснениеКомментария;
			Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
			Элемент.РастягиватьПоГоризонтали = Ложь;
			Элемент.КнопкаВыбора = Истина;
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры формы заполнения анкеты.

// Параметры:
//  ЭлементарныйВопрос - ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования - вопрос, для которого получаются ответы.
//  Форма              - ФормаКлиентскогоПриложения - форма, из которой происходит вызов.
//
// Возвращаемое значение:
//   Массив из СтрокаТаблицыЗначений
//
Функция ВариантыОтветовНаВопрос(ЭлементарныйВопрос, Форма) Экспорт

	Возврат (Форма.ВариантыОтветовНаВопросы.НайтиСтроки(Новый Структура("Вопрос", ЭлементарныйВопрос)));

КонецФункции

// Параметры:
//   СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы вопросов раздела:
//   * Наименование - Строка
//
// Возвращаемое значение:
//   Строка
//
Функция ПолныйКодНаименование(СтрокаТаблицы)

	Возврат ?(СтрокаТаблицы.ТипСтроки = "Раздел", "Раздел ", "") + СтрокаТаблицы.ПолныйКод + " " + ?(
		СтрокаТаблицы.ТипСтроки = "Раздел", СтрокаТаблицы.Наименование, СтрокаТаблицы.Формулировка);

КонецФункции

// Устанавливает значения параметров и обработчик события "НачалоВыбора",
// для поля формы, предназначенного для ввода текста.
//
// Параметры:
//  Элемент - ПолеФормы - элемент, для которого устанавливаются параметры.
//
Процедура УстановитьПараметрыЭлементаЯчейкаТекст(Элемент)

	Элемент.КнопкаВыбора = Истина;
	Элемент.МногострочныйРежим = Истина;
	Элемент.УстановитьДействие("НачалоВыбора", "Подключаемый_НачалоВыбораТекстовыхЯчеекТабличныхВопросов");

КонецПроцедуры

// Параметры:
//  Элемент - ПолеФормы - элемент, для которого устанавливаются параметры.
//  РеквизитыЭлементарногоВопроса - ДанныеФормыЭлементКоллекции - содержит значения параметров.
// 
Процедура УстановитьПараметрыЭлементаЯчейкаЧисло(Элемент, РеквизитыЭлементарногоВопроса)

	Элемент.МинимальноеЗначение  = ?(РеквизитыЭлементарногоВопроса.ИспользоватьМинимальноеЗначение,
		РеквизитыЭлементарногоВопроса.МинимальноеЗначение, Неопределено);
	Элемент.МаксимальноеЗначение = ?(РеквизитыЭлементарногоВопроса.ИспользоватьМаксимальноеЗначение,
		РеквизитыЭлементарногоВопроса.МаксимальноеЗначение, Неопределено);

КонецПроцедуры

// Удаляет ранее динамически сформированные элементы формы заполнения анкеты.
//
// Параметры:
//  Форма              - ФормаКлиентскогоПриложения - форма, у которой удаляются элементы.
//  УдаляемыеРеквизиты - Массив из Строка - имена удаляемых реквизитов формы, на основании которых удаляются
//                       элементы формы.
//
Процедура УдалитьЭлементыФормыЗаполнения(Форма, УдаляемыеРеквизиты)

	Для Каждого УдаляемыйРеквизит Из УдаляемыеРеквизиты Цикл

		ИмяВопроса = Лев(УдаляемыйРеквизит.Значение, 43);

		НайденныйЭлементФормы = Форма.Элементы.Найти(ИмяВопроса + "_Группа");

		Если НайденныйЭлементФормы <> Неопределено Тогда
			МассивПодчиненныеЭлементы = НайденныйЭлементФормы.ПодчиненныеЭлементы;
			Для Каждого ПодчиненныйЭлемент Из МассивПодчиненныеЭлементы Цикл
				Форма.Элементы.Удалить(ПодчиненныйЭлемент);
			КонецЦикла;
			Форма.Элементы.Удалить(НайденныйЭлементФормы);
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

// Параметры:
//  Форма          - ФормаКлиентскогоПриложения - форма, для которой выполняется операция.
//  ДеревоРазделов - ДанныеФормыДерево - дерево, для которого получаются данные.
//
Процедура ЗаполнитьДеревоРазделов(Форма, ДеревоРазделов) Экспорт

	ВыборкаРазделы = ВыборкаРазделовПоШаблонуАнкеты(Форма.ШаблонАнкеты);
	ДобавитьСтрокиВДеревоРазделов(ВыборкаРазделы, ДеревоРазделов);

КонецПроцедуры

// Параметры:
//  ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - шаблон анкеты, по которому получается выборка.
//
// Возвращаемое значение:
//   ВыборкаИзРезультатаЗапроса
//
Функция ВыборкаРазделовПоШаблонуАнкеты(ШаблонАнкеты)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"
	|ВЫБРАТЬ
	|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВопросыШаблонаАнкеты.Ссылка) КАК Количество,
	|	ВопросыШаблонаАнкеты.Родитель КАК Родитель
	|ПОМЕСТИТЬ КоличествоВопросов
	|ИЗ
	|	Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
	|ГДЕ
	|	ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
	|	И НЕ ВопросыШаблонаАнкеты.ЭтоГруппа
	|
	|СГРУППИРОВАТЬ ПО
	|	ВопросыШаблонаАнкеты.Родитель
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВопросыШаблонаАнкеты.Ссылка КАК Ссылка,
	|	ВопросыШаблонаАнкеты.Формулировка КАК Формулировка,
	|	КоличествоВопросов.Количество КАК Количество
	|ИЗ
	|	Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
	|		ЛЕВОЕ СОЕДИНЕНИЕ КоличествоВопросов КАК КоличествоВопросов
	|		ПО ВопросыШаблонаАнкеты.Ссылка = КоличествоВопросов.Родитель
	|ГДЕ
	|	ВопросыШаблонаАнкеты.ЭтоГруппа
	|	И НЕ ВопросыШаблонаАнкеты.ПометкаУдаления
	|	И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
	|
	|УПОРЯДОЧИТЬ ПО
	|	Ссылка ИЕРАРХИЯ";

	Запрос.УстановитьПараметр("ШаблонАнкеты", ШаблонАнкеты);

	Возврат Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

КонецФункции

// Параметры:
//  ВыборкаРазделы - ВыборкаИзРезультатаЗапроса - иерархическая выборка по разделам шаблона анкеты.
//  Родитель       - ДанныеФормыЭлементДерева   - родительский элемент дерева, для которого добавляются строки.
//
Процедура ДобавитьСтрокиВДеревоРазделов(ВыборкаРазделы, Родитель)

	ЭлементыДереваРодителя = Родитель.ПолучитьЭлементы();
	Пока ВыборкаРазделы.Следующий() Цикл

		НовыйЭлементДерева = ЭлементыДереваРодителя.Добавить();
		НовыйЭлементДерева.Формулировка       = ВыборкаРазделы.Формулировка;
		НовыйЭлементДерева.КодКартинки        = АнкетированиеКлиентСервер.ПолучитьКодКартинкиШаблонаАнкеты(Истина);
		НовыйЭлементДерева.ТипСтроки          = "Раздел";
		НовыйЭлементДерева.Ссылка             = ВыборкаРазделы.Ссылка;
		НовыйЭлементДерева.КоличествоВопросов = ВыборкаРазделы.Количество;

		ДобавитьСтрокиВДеревоРазделов(ВыборкаРазделы.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией),
			НовыйЭлементДерева);

	КонецЦикла;

КонецПроцедуры

// Получает необходимую информацию по разделу анкеты: вопросы раздела, 
// необходимые реквизиты вопросов, варианты ответов. Помещает полученную информацию в 
// реквизиты формы.
//
// Параметры:
//  Форма            - ФормаКлиентскогоПриложения - форма, для которой получается информация.
//  ШаблонАнкеты     - СправочникСсылка.ШаблоныАнкет - шаблон анкеты, по которому получается информация.
//  Раздел           - СправочникСсылка.ВопросыШаблонаАнкеты - раздел анкеты, по которому получается информация.
//  ПолныйКодРаздела - Строка - полный код раздела, по которому получается информация.
//
Процедура ПолучитьИнформациюПоВопросамАнкеты(Форма, ШаблонАнкеты, Раздел, ПолныйКодРаздела)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ВопросыДляАнкетирования.Ссылка КАК Вопрос,
	|	ВопросыДляАнкетирования.Формулировка КАК Формулировка,
	|	ВопросыДляАнкетирования.ТипЗначения КАК Тип,
	|	ВопросыДляАнкетирования.ТипОтвета КАК ТипОтвета,
	|	ВопросыДляАнкетирования.ВидПереключателя КАК ВидПереключателя,
	|	ВопросыДляАнкетирования.ВидФлажка КАК ВидФлажка,
	|	ВопросыДляАнкетирования.МинимальноеЗначение КАК МинимальноеЗначение,
	|	ВопросыДляАнкетирования.МаксимальноеЗначение КАК МаксимальноеЗначение,
	|	ВопросыДляАнкетирования.ИспользоватьМинимальноеЗначение КАК ИспользоватьМинимальноеЗначение,
	|	ВопросыДляАнкетирования.ИспользоватьМаксимальноеЗначение КАК ИспользоватьМаксимальноеЗначение
	|ИЗ
	|	ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования
	|ГДЕ
	|	ВопросыДляАнкетирования.Ссылка В
	|			(ВЫБРАТЬ РАЗЛИЧНЫЕ
	|				ВопросыШаблонаАнкеты.ЭлементарныйВопрос
	|			ИЗ
	|				Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
	|			ГДЕ
	|				ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
	|				И ВопросыШаблонаАнкеты.Родитель = &Раздел
	|		
	|			ОБЪЕДИНИТЬ ВСЕ
	|		
	|			ВЫБРАТЬ
	|				ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос
	|			ИЗ
	|				Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса
	|			ГДЕ
	|				ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.Владелец = &ШаблонАнкеты
	|				И ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.Родитель = &Раздел
	|		
	|			ОБЪЕДИНИТЬ ВСЕ
	|		
	|			ВЫБРАТЬ
	|				ВопросыШаблонаАнкетыСоставКомплексногоВопроса.ЭлементарныйВопрос
	|			ИЗ
	|				Справочник.ВопросыШаблонаАнкеты.СоставКомплексногоВопроса КАК ВопросыШаблонаАнкетыСоставКомплексногоВопроса
	|			ГДЕ
	|				ВопросыШаблонаАнкетыСоставКомплексногоВопроса.Ссылка.Владелец = &ШаблонАнкеты
	|				И ВопросыШаблонаАнкетыСоставКомплексногоВопроса.Ссылка.Родитель = &Раздел)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВопросыШаблонаАнкеты.Ссылка КАК ВопросШаблона,
	|	ВопросыШаблонаАнкеты.Родитель КАК Родитель,
	|	ВопросыШаблонаАнкеты.Наименование КАК Наименование,
	|	ВопросыШаблонаАнкеты.Обязательный КАК Обязательный,
	|	ВопросыШаблонаАнкеты.ТипВопроса КАК ТипВопроса,
	|	ВопросыШаблонаАнкеты.ТипТабличногоВопроса КАК ТипТабличногоВопроса,
	|	ВопросыШаблонаАнкеты.ЭлементарныйВопрос КАК ЭлементарныйВопрос,
	|	""Вопрос"" КАК ТипСтроки,
	|	ВопросыШаблонаАнкеты.РодительВопрос КАК РодительВопрос,
	|	ВопросыШаблонаАнкеты.Подсказка КАК Подсказка,
	|	ВопросыШаблонаАнкеты.СпособОтображенияПодсказки КАК СпособОтображенияПодсказки,
	|	ВопросыШаблонаАнкеты.СоставТабличногоВопроса.(
	|		НомерСтроки КАК НомерСтроки,
	|		ЭлементарныйВопрос КАК ЭлементарныйВопрос
	|	) КАК СоставТабличногоВопроса,
	|	ВопросыШаблонаАнкеты.ПредопределенныеОтветы.(
	|		НомерСтроки КАК НомерСтроки,
	|		ЭлементарныйВопрос КАК ЭлементарныйВопрос,
	|		Ответ КАК Ответ
	|	) КАК ПредопределенныеОтветы,
	|	ВопросыШаблонаАнкеты.СоставКомплексногоВопроса.(
	|		НомерСтроки КАК НомерСтроки,
	|		ЭлементарныйВопрос КАК ЭлементарныйВопрос,
	|		ЭлементарныйВопрос.ТребуетсяКомментарий КАК ТребуетсяКомментарий,
	|		ЭлементарныйВопрос.ПояснениеКомментария КАК ПояснениеКомментария
	|	) КАК СоставКомплексногоВопроса,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.Длина, 0) КАК Длина,
	|	ВопросыДляАнкетирования.ТипЗначения КАК ТипЗначения,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ТребуетсяКомментарий, ЛОЖЬ) КАК ТребуетсяКомментарий,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ПояснениеКомментария, """") КАК ПояснениеКомментария,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.МинимальноеЗначение, 0) КАК МинимальноеЗначение,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.МаксимальноеЗначение, 0) КАК МаксимальноеЗначение,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ВидПереключателя, ЗНАЧЕНИЕ(Перечисление.ВидыПереключателяВАнкетах.ПустаяСсылка)) КАК ВидПереключателя,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ВидФлажка, ЗНАЧЕНИЕ(Перечисление.ВидыФлажкаВАнкетах.ПустаяСсылка)) КАК ВидФлажка,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ТипОтвета, ЗНАЧЕНИЕ(Перечисление.ТипыОтветовНаВопрос.ПустаяСсылка)) КАК ТипОтвета,
	|	ЕСТЬNULL(ВопросыШаблонаАнкеты.Формулировка, """") КАК Формулировка,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.Точность, 0) КАК Точность,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ИспользоватьМинимальноеЗначение, ЛОЖЬ) КАК ИспользоватьМинимальноеЗначение,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ИспользоватьМаксимальноеЗначение, ЛОЖЬ) КАК ИспользоватьМаксимальноеЗначение,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ПоказыватьПолосуРегулирования, ЛОЖЬ) КАК ПоказыватьПолосуРегулирования,
	|	ЕСТЬNULL(ВопросыДляАнкетирования.ШагПолосыРегулирования, 0) КАК ШагПолосыРегулирования,
	|	ВопросыШаблонаАнкеты.ИспользоватьОтказОтОтвета КАК ИспользоватьОтказОтОтвета,
	|	ВопросыШаблонаАнкеты.ФормулировкаОтказаОтОтвета КАК ФормулировкаОтказаОтОтвета,
	|	ВопросыДляАнкетирования.ДиапазонПодсказокЧисловогоВопроса.(
	|		НомерСтроки КАК НомерСтроки,
	|		ЗначениеДо КАК ЗначениеДо,
	|		Подсказка КАК Подсказка
	|	) КАК ДиапазонПодсказокЧисловогоВопроса
	|ИЗ
	|	Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования
	|		ПО ВопросыШаблонаАнкеты.ЭлементарныйВопрос = ВопросыДляАнкетирования.Ссылка
	|ГДЕ
	|	НЕ ВопросыШаблонаАнкеты.ПометкаУдаления
	|	И ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
	|	И ВопросыШаблонаАнкеты.Родитель = &Раздел
	|	И НЕ ВопросыШаблонаАнкеты.ЭтоГруппа
	|
	|УПОРЯДОЧИТЬ ПО
	|	ВопросыШаблонаАнкеты.Код
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВариантыОтветовАнкет.Владелец КАК Вопрос,
	|	ВариантыОтветовАнкет.Ссылка КАК Ответ,
	|	ВариантыОтветовАнкет.Представление КАК Представление,
	|	ВариантыОтветовАнкет.ТребуетОткрытогоОтвета КАК ТребуетОткрытогоОтвета,
	|	ВариантыОтветовАнкет.Подсказка КАК Подсказка
	|ИЗ
	|	Справочник.ВариантыОтветовАнкет КАК ВариантыОтветовАнкет
	|ГДЕ
	|	ВариантыОтветовАнкет.Владелец В
	|			(ВЫБРАТЬ
	|				ВопросыШаблонаАнкеты.ЭлементарныйВопрос
	|			ИЗ
	|				Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
	|			ГДЕ
	|				ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
	|				И ВопросыШаблонаАнкеты.Родитель = &Раздел
	|				И НЕ ВопросыШаблонаАнкеты.ЭтоГруппа
	|				И НЕ ВопросыШаблонаАнкеты.ПометкаУдаления
	|		
	|			ОБЪЕДИНИТЬ ВСЕ
	|		
	|			ВЫБРАТЬ
	|				ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос
	|			ИЗ
	|				Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса
	|			ГДЕ
	|				ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.Владелец = &ШаблонАнкеты
	|				И ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.Родитель = &Раздел
	|				И НЕ ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.ЭтоГруппа
	|				И НЕ ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка.ПометкаУдаления
	|		
	|			ОБЪЕДИНИТЬ ВСЕ
	|		
	|			ВЫБРАТЬ
	|				ВопросыШаблонаАнкетыСоставКомплексногоВопроса.ЭлементарныйВопрос
	|			ИЗ
	|				Справочник.ВопросыШаблонаАнкеты.СоставКомплексногоВопроса КАК ВопросыШаблонаАнкетыСоставКомплексногоВопроса
	|			ГДЕ
	|				ВопросыШаблонаАнкетыСоставКомплексногоВопроса.Ссылка.Владелец = &ШаблонАнкеты
	|				И ВопросыШаблонаАнкетыСоставКомплексногоВопроса.Ссылка.Родитель = &Раздел
	|				И НЕ ВопросыШаблонаАнкетыСоставКомплексногоВопроса.Ссылка.ЭтоГруппа
	|				И НЕ ВопросыШаблонаАнкетыСоставКомплексногоВопроса.Ссылка.ПометкаУдаления)
	|	И НЕ ВариантыОтветовАнкет.ПометкаУдаления
	|
	|УПОРЯДОЧИТЬ ПО
	|	ВариантыОтветовАнкет.РеквизитДопУпорядочивания";

	Запрос.УстановитьПараметр("ШаблонАнкеты", ШаблонАнкеты);
	Запрос.УстановитьПараметр("Раздел", Раздел);

	МассивРезультатовЗапросов = Запрос.ВыполнитьПакет();

	Форма.ВопросыПредставлениеТипы.Загрузить(МассивРезультатовЗапросов[0].Выгрузить());
	
	ВыборкаВопросыПоРазделуАнкеты = МассивРезультатовЗапросов[1].Выбрать();
	СчетчикВопросов = 0;

	Пока ВыборкаВопросыПоРазделуАнкеты.Следующий() Цикл

		СчетчикВопросов = СчетчикВопросов + 1;
		ТаблицаВопросовФормы = Форма.ТаблицаВопросовРаздела; // ТаблицаЗначений
		НоваяСтрока = ТаблицаВопросовФормы.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаВопросыПоРазделуАнкеты,,
			"СоставТабличногоВопроса,ПредопределенныеОтветы,СоставКомплексногоВопроса,ДиапазонПодсказокЧисловогоВопроса");
		НоваяСтрока.СоставТабличногоВопроса.Загрузить(ВыборкаВопросыПоРазделуАнкеты.СоставТабличногоВопроса.Выгрузить());
		НоваяСтрока.СоставТабличногоВопроса.Сортировать("НомерСтроки Возр");
		НоваяСтрока.ПредопределенныеОтветы.Загрузить(ВыборкаВопросыПоРазделуАнкеты.ПредопределенныеОтветы.Выгрузить());
		НоваяСтрока.ПредопределенныеОтветы.Сортировать("НомерСтроки Возр");
		НоваяСтрока.СоставКомплексногоВопроса.Загрузить(
			ВыборкаВопросыПоРазделуАнкеты.СоставКомплексногоВопроса.Выгрузить());
		НоваяСтрока.СоставКомплексногоВопроса.Сортировать("НомерСтроки Возр");
		НоваяСтрока.ДиапазонПодсказокЧисловогоВопроса.Загрузить(
			ВыборкаВопросыПоРазделуАнкеты.ДиапазонПодсказокЧисловогоВопроса.Выгрузить());
		НоваяСтрока.ДиапазонПодсказокЧисловогоВопроса.Сортировать("НомерСтроки Убыв");
		НоваяСтрока.КлючСтроки = Новый УникальныйИдентификатор;
		НоваяСтрока.ПолныйКод  = ПолныйКодРаздела + "." + XMLСтрока(СчетчикВопросов);

	КонецЦикла;
	
	Форма.ВариантыОтветовНаВопросы.Загрузить(МассивРезультатовЗапросов[2].Выгрузить());

КонецПроцедуры

// Параметры:
//   Форма  - ФормаКлиентскогоПриложения - форма для которой формируется таблица подчинения.
//
Процедура СформироватьТаблицуПодчиненияВопросов(Форма) Экспорт

	Форма.ПодчиненныеВопросы.Очистить();

	Запрос = Новый Запрос;
	Запрос.Текст =
	"
	|ВЫБРАТЬ
	|	ВнешнийИсточник.ВопросШаблона КАК ВопросШаблона,
	|	ВнешнийИсточник.РодительВопрос КАК РодительВопрос,
	|	ВнешнийИсточник.ТипВопроса,
	|	ВнешнийИсточник.СтроковыйКлюч,
	|	ВнешнийИсточник.Обязательный,
	|	ВнешнийИсточник.ТребуетсяКомментарий,
	|	ВнешнийИсточник.ЭлементарныйВопрос,
	|	ВнешнийИсточник.ТипОтвета
	|ПОМЕСТИТЬ ВопросыРаздела
	|ИЗ
	|	&ВнешнийИсточник КАК ВнешнийИсточник
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВопросыРаздела.ВопросШаблона КАК ВопросШаблона,
	|	ВопросыРаздела.СтроковыйКлюч
	|ПОМЕСТИТЬ ВопросыСУсловием
	|ИЗ
	|	ВопросыРаздела КАК ВопросыРаздела
	|ГДЕ
	|	ВопросыРаздела.ТипВопроса = ЗНАЧЕНИЕ(Перечисление.ТипыВопросовШаблонаАнкеты.ВопросСУсловием)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВопросыРаздела.РодительВопрос КАК РодительВопрос,
	|	ВопросыРаздела.ВопросШаблона,
	|	ВопросыРаздела.СтроковыйКлюч КАК КлючСтроки,
	|	ВопросыСУсловием.СтроковыйКлюч КАК КлючСтрокиРодителя,
	|	ВопросыРаздела.Обязательный,
	|	ВопросыРаздела.ТребуетсяКомментарий,
	|	ВопросыРаздела.ТипВопроса,
	|	ВопросыРаздела.ЭлементарныйВопрос,
	|	ВопросыРаздела.ТипОтвета
	|ИЗ
	|	ВопросыРаздела КАК ВопросыРаздела
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВопросыСУсловием КАК ВопросыСУсловием
	|		ПО ВопросыРаздела.РодительВопрос = ВопросыСУсловием.ВопросШаблона
	|ГДЕ
	|	ВопросыРаздела.РодительВопрос В
	|			(ВЫБРАТЬ
	|				ВопросыСУсловием.ВопросШаблона
	|			ИЗ
	|				ВопросыСУсловием КАК ВопросыСУсловием)
	|ИТОГИ ПО
	|	КлючСтрокиРодителя";

	ВнешнийИсточник = Форма.ТаблицаВопросовРаздела.Выгрузить(); // ТаблицаЗначений
	ВнешнийИсточник.Колонки.Добавить("СтроковыйКлюч", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50)));
	Для Каждого СтрокаТаблицы Из ВнешнийИсточник Цикл
		СтрокаТаблицы.СтроковыйКлюч = Строка(СтрокаТаблицы.КлючСтроки);
	КонецЦикла;
	Запрос.УстановитьПараметр("ВнешнийИсточник", ВнешнийИсточник);

	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат;
	КонецЕсли;

	Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока Выборка.Следующий() Цикл

		Форма.Элементы[АнкетированиеКлиентСервер.ИмяВопроса(Выборка.КлючСтрокиРодителя)].УстановитьДействие(
			"ПриИзменении", "Подключаемый_ПриИзмененииВопросовСУсловием");

		ВыборкаДетали = Выборка.Выбрать();

		НоваяСтрока = Форма.ПодчиненныеВопросы.Добавить();
		НоваяСтрока.Вопрос = Выборка.КлючСтрокиРодителя;

		Пока ВыборкаДетали.Следующий() Цикл

			ИмяВопроса = АнкетированиеКлиентСервер.ИмяВопроса(ВыборкаДетали.КлючСтроки);
			ТаблицаПодчиненные = НоваяСтрока.Подчиненные; // ТаблицаЗначений
			Если ВыборкаДетали.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Табличный Тогда

				НоваяСтрокаПодчиненные = ТаблицаПодчиненные.Добавить();
				НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Таблица";
				НоваяСтрокаПодчиненные.Обязательный = Выборка.Обязательный;

			ИначеЕсли ВыборкаДетали.ТипВопроса = Перечисления.ТипыВопросовШаблонаАнкеты.Комплексный Тогда

				НоваяСтрокаПодчиненные = ТаблицаПодчиненные.Добавить();
				НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Группа";
				НоваяСтрокаПодчиненные.Обязательный = Выборка.Обязательный;

			Иначе

				Если ВыборкаДетали.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда

					ВариантыОтветовНаВопрос = ВариантыОтветовНаВопрос(ВыборкаДетали.ЭлементарныйВопрос, Форма);

					Счетчик = 0;
					Для Каждого ВариантОтвета Из ВариантыОтветовНаВопрос Цикл

						Счетчик = Счетчик + 1;
						НоваяСтрокаПодчиненные = ТаблицаПодчиненные.Добавить();
						НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Реквизит_" + Счетчик;
						НоваяСтрокаПодчиненные.Обязательный                   = Ложь;

						Если ВариантОтвета.ТребуетОткрытогоОтвета Тогда
							НоваяСтрокаПодчиненные = ТаблицаПодчиненные.Добавить();
							НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Комментарий_"
								+ Счетчик;
							НоваяСтрокаПодчиненные.Обязательный                   = Ложь;
						КонецЕсли;
					КонецЦикла;

				Иначе

					НоваяСтрокаПодчиненные = ТаблицаПодчиненные.Добавить();
					НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса;
					НоваяСтрокаПодчиненные.Обязательный                   = ВыборкаДетали.Обязательный;

					Если ВыборкаДетали.ТребуетсяКомментарий Тогда
						НоваяСтрокаПодчиненные = ТаблицаПодчиненные.Добавить();
						НоваяСтрокаПодчиненные.ИмяЭлементаПодчиненногоВопроса = ИмяВопроса + "_Комментарий";
						НоваяСтрокаПодчиненные.Обязательный                   = Ложь;
					КонецЕсли;

				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Прочее

Процедура УдалитьВопросыШаблонаАнкеты(СсылкаВладелец) Экспорт

	УстановитьПривилегированныйРежим(Истина);

	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("Справочник.ВопросыШаблонаАнкеты");
	ЭлементБлокировки.УстановитьЗначение("Владелец", СсылкаВладелец);

	НачатьТранзакцию();
	Попытка

		Блокировка.Заблокировать();

		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ
		|	ВопросыШаблонаАнкеты.Ссылка
		|ИЗ
		|	Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
		|ГДЕ
		|	ВопросыШаблонаАнкеты.Владелец = &Владелец";

		Запрос.УстановитьПараметр("Владелец", СсылкаВладелец);

		РезультатЗапроса = Запрос.Выполнить();
		Если Не РезультатЗапроса.Пустой() Тогда

			МассивСсылок = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка");
			Для Каждого ЭлементМассива Из МассивСсылок Цикл

				СправочникОбъект = ЭлементМассива.ПолучитьОбъект();
				Если (Не СправочникОбъект = Неопределено) Тогда
					СправочникОбъект.Удалить();
				КонецЕсли;

			КонецЦикла;
		КонецЕсли;

		ЗафиксироватьТранзакцию();

	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;

	УстановитьПривилегированныйРежим(Ложь);

КонецПроцедуры

// Получает представления элементарный вопросов табличных вопросов
// и заполняет соответствие ПредставленияВопросов, из которого потом будут получаться представления
// вопросов при выводе табличных вопросов.
//
// Параметры:
//   ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет - шаблон, по которому проводился опрос.
//
// Возвращаемое значение:
//   Соответствие из КлючИЗначение:
//     * Ключ - СправочникСсылка.ВопросыШаблонаАнкеты
//     * Значение - Структура:
//        ** Формулировка - Строка
//        ** АгрегироватьСуммуВОтчетах - Булево
//
Функция ПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты) Экспорт

	ПредставленияВопросов = Новый Соответствие;

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ВопросыШаблонаАнкеты.Ссылка
	|ПОМЕСТИТЬ ВопросыШаблона
	|ИЗ
	|	Справочник.ВопросыШаблонаАнкеты КАК ВопросыШаблонаАнкеты
	|ГДЕ
	|	ВопросыШаблонаАнкеты.Владелец = &ШаблонАнкеты
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ВопросыШаблонаАнкетыСоставТабличногоВопроса.ЭлементарныйВопрос
	|ПОМЕСТИТЬ ЭлементарныеВопросы
	|ИЗ
	|	Справочник.ВопросыШаблонаАнкеты.СоставТабличногоВопроса КАК ВопросыШаблонаАнкетыСоставТабличногоВопроса
	|ГДЕ
	|	ВопросыШаблонаАнкетыСоставТабличногоВопроса.Ссылка В
	|			(ВЫБРАТЬ
	|				ВопросыШаблона.Ссылка
	|			ИЗ
	|				ВопросыШаблона КАК ВопросыШаблона)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВопросыДляАнкетирования.Ссылка,
	|	ВопросыДляАнкетирования.Формулировка,
	|	ВопросыДляАнкетирования.АгрегироватьСуммуВОтчетах
	|ИЗ
	|	ПланВидовХарактеристик.ВопросыДляАнкетирования КАК ВопросыДляАнкетирования
	|ГДЕ
	|	ВопросыДляАнкетирования.Ссылка В
	|			(ВЫБРАТЬ
	|				ЭлементарныеВопросы.ЭлементарныйВопрос
	|			ИЗ
	|				ЭлементарныеВопросы КАК ЭлементарныеВопросы)";

	Запрос.УстановитьПараметр("ШаблонАнкеты", ШаблонАнкеты);

	Результат = Запрос.Выполнить();
	Если Не Результат.Пустой() Тогда

		Выборка = Результат.Выбрать();
		Пока Выборка.Следующий() Цикл
			ПредставленияВопросов.Вставить(Выборка.Ссылка, Новый Структура("Формулировка,АгрегироватьСуммуВОтчетах",
				Выборка.Формулировка, Выборка.АгрегироватьСуммуВОтчетах));
		КонецЦикла;

	КонецЕсли;

	Возврат ПредставленияВопросов;

КонецФункции

// Параметры:
//  Респондент  - СправочникСсылка - респондент для которого получается список анкет.
//
// Возвращаемое значение:
//   ТаблицаЗначений   - таблица, содержащая информацию о доступных респонденту анкетах. Колонки:
//      * Статус        - Строка
//      * АнкетаОпрос   - ДокументСсылка.Анкета
//                      - ДокументСсылка.НазначениеОпросов
//      * ДатаОкончания - Дата
//      * Наименование  - Строка
//      * ДатаАнкеты    - Дата
//   Неопределено      - в случае если для респондента нет доступных анкет.
//
Функция ТаблицаДоступныхРеспондентуАнкет(Респондент) Экспорт

	Если Не ЗначениеЗаполнено(Респондент) Тогда
		Возврат Неопределено;
	КонецЕсли;

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Респондент", Респондент);
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
	Запрос.УстановитьПараметр("ПустаяДата", Дата(1, 1, 1));
	Запрос.УстановитьПараметр("ТипРеспондентов", Справочники[Респондент.Метаданные().Имя].ПустаяСсылка());
	Запрос.Текст =
	"ВЫБРАТЬ
	|	НазначениеОпросов.Ссылка КАК Ссылка,
	|	НазначениеОпросов.СвободныйОпрос КАК СвободныйОпрос,
	|	НазначениеОпросов.ДатаОкончания КАК ДатаОкончания,
	|	НазначениеОпросов.Наименование КАК Наименование
	|ПОМЕСТИТЬ ДействующиеОпросы
	|ИЗ
	|	Документ.НазначениеОпросов КАК НазначениеОпросов
	|ГДЕ
	|	НазначениеОпросов.Проведен
	|	И НЕ НазначениеОпросов.ПометкаУдаления
	|	И НазначениеОпросов.ТипРеспондентов = &ТипРеспондентов
	|	И (НазначениеОпросов.ДатаНачала = &ПустаяДата
	|			ИЛИ НАЧАЛОПЕРИОДА(НазначениеОпросов.ДатаНачала, ДЕНЬ) < &ТекущаяДата)
	|	И (НазначениеОпросов.ДатаОкончания = &ПустаяДата
	|			ИЛИ КОНЕЦПЕРИОДА(НазначениеОпросов.ДатаОкончания, ДЕНЬ) > &ТекущаяДата)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ДействующиеОпросы.Ссылка КАК Ссылка,
	|	ДействующиеОпросы.ДатаОкончания КАК ДатаОкончания,
	|	ДействующиеОпросы.Наименование КАК Наименование
	|ПОМЕСТИТЬ ДействующиеОпросыОтборПоРеспонденту
	|ИЗ
	|	ДействующиеОпросы КАК ДействующиеОпросы
	|ГДЕ
	|	ДействующиеОпросы.СвободныйОпрос
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	НазначениеОпросовРеспонденты.Ссылка,
	|	НазначениеОпросов.ДатаОкончания,
	|	НазначениеОпросов.Наименование
	|ИЗ
	|	Документ.НазначениеОпросов.Респонденты КАК НазначениеОпросовРеспонденты
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.НазначениеОпросов КАК НазначениеОпросов
	|		ПО НазначениеОпросовРеспонденты.Ссылка = НазначениеОпросов.Ссылка
	|ГДЕ
	|	НазначениеОпросовРеспонденты.Респондент = &Респондент
	|	И НазначениеОпросовРеспонденты.Ссылка В
	|			(ВЫБРАТЬ
	|				ДействующиеОпросы.Ссылка
	|			ИЗ
	|				ДействующиеОпросы КАК ДействующиеОпросы
	|			ГДЕ
	|				НЕ ДействующиеОпросы.СвободныйОпрос)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Анкета.Ссылка КАК Ссылка,
	|	Анкета.ДатаРедактирования КАК Дата,
	|	Анкета.Проведен КАК Проведен,
	|	Анкета.Опрос КАК Опрос
	|ПОМЕСТИТЬ АнкетыПоДействующимЗапросам
	|ИЗ
	|	Документ.Анкета КАК Анкета
	|ГДЕ
	|	Анкета.Опрос В
	|			(ВЫБРАТЬ
	|				ДействующиеОпросыОтборПоРеспонденту.Ссылка
	|			ИЗ
	|				ДействующиеОпросыОтборПоРеспонденту КАК ДействующиеОпросыОтборПоРеспонденту)
	|	И Анкета.Респондент = &Респондент
	|	И НЕ Анкета.ПометкаУдаления
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВЫБОР
	|		КОГДА АнкетыПоДействующимЗапросам.Ссылка ЕСТЬ NULL
	|			ТОГДА ""Опросы""
	|		ИНАЧЕ ""Анкеты""
	|	КОНЕЦ КАК Статус,
	|	ВЫБОР
	|		КОГДА АнкетыПоДействующимЗапросам.Ссылка ЕСТЬ NULL
	|			ТОГДА ДействующиеОпросыОтборПоРеспонденту.Ссылка
	|		ИНАЧЕ АнкетыПоДействующимЗапросам.Ссылка
	|	КОНЕЦ КАК АнкетаОпрос,
	|	ДействующиеОпросыОтборПоРеспонденту.ДатаОкончания КАК ДатаОкончания,
	|	ДействующиеОпросыОтборПоРеспонденту.Наименование КАК Наименование,
	|	АнкетыПоДействующимЗапросам.Дата КАК ДатаАнкеты,
	|	ЕСТЬNULL(АнкетыПоДействующимЗапросам.Проведен, ЛОЖЬ) КАК Проведен
	|ПОМЕСТИТЬ НеотвеченныеОпросыСохраненныеАнкеты
	|ИЗ
	|	ДействующиеОпросыОтборПоРеспонденту КАК ДействующиеОпросыОтборПоРеспонденту
	|		ЛЕВОЕ СОЕДИНЕНИЕ АнкетыПоДействующимЗапросам КАК АнкетыПоДействующимЗапросам
	|		ПО ДействующиеОпросыОтборПоРеспонденту.Ссылка = АнкетыПоДействующимЗапросам.Опрос
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	НеотвеченныеОпросыСохраненныеАнкеты.Статус КАК Статус,
	|	НеотвеченныеОпросыСохраненныеАнкеты.АнкетаОпрос КАК АнкетаОпрос,
	|	НеотвеченныеОпросыСохраненныеАнкеты.ДатаОкончания КАК ДатаОкончания,
	|	НеотвеченныеОпросыСохраненныеАнкеты.Наименование КАК Наименование,
	|	НеотвеченныеОпросыСохраненныеАнкеты.ДатаАнкеты КАК ДатаАнкеты
	|ИЗ
	|	НеотвеченныеОпросыСохраненныеАнкеты КАК НеотвеченныеОпросыСохраненныеАнкеты
	|ГДЕ
	|	НЕ НеотвеченныеОпросыСохраненныеАнкеты.Проведен";

	Результат = Запрос.Выполнить();

	Если Не Результат.Пустой() Тогда
		Возврат Результат.Выгрузить();
	КонецЕсли;

КонецФункции

Функция РазрешенВводНулевогоЗначенияВЧисловоеПоле(СтрокаТаблицы) Экспорт

	Если СтрокаТаблицы.ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.Число Тогда
		Возврат Ложь;
	КонецЕсли;

	Слева = ?(СтрокаТаблицы.ИспользоватьМинимальноеЗначение, СтрокаТаблицы.МинимальноеЗначение, -1);
	Справа = ?(СтрокаТаблицы.ИспользоватьМаксимальноеЗначение, СтрокаТаблицы.МаксимальноеЗначение, 1);

	Возврат (Слева <= 0 И Справа >= 0);

КонецФункции

#КонецОбласти